`

JMS及JMS 简单使用案例

阅读更多
1 JMS应用程序有四个组成部分:JMS服务提供者、消息管理对象、消息的生产者消费者和消息本身。

  JMS服务提供者实现消息队列和通知,同时实现消息管理的API。JMS已经是J2EE API的一部分,J2EE服务器都提供JMS服务。

  消息管理对象提供对消息进行操作的API。JMS API中有两个消息管理对象:ConnectionFactory和Destination,根据消息的消费方式的不同 ConnectionFactory可以分为QueueConnectionFactory和 TopicConnectionFactory,Destination可以分为Queue和Topic。用这两个管理对象可以建立到消息服务的会话。

  消息的生产者和消费者。它们可以毫不相干,只需要消息的消费者知道如何使用消息即可。根据消息消费者数目的不同,消息的消费者分为两类:subscriber 和receiver,同样消息发送者也分为两类:Publisher和Sender。

  消息。JMS API规定了五种消息:Message、MapMessage、TextMessage、ByteMessage、StreamMessage和ObjectMessage。

2  API:

  QueueConnectionFactory和TopicConnectionFactory 连接工厂用来生成QueueConnection和TopicConnection的实例

  QueueConnection和TopicConnection连接对象用来建立到JMS的连接并生成会话实例

  QueueSession和TopicSession会话对象用来创建消息、消息的生产者和消息的消费者(解释一下消息的生产者:它并不代表生成消息实例的对象而是指将消息发送到JMS的对象)

  QueueSender、TopicPUblisher和QueueReciever、TopicSubscriber。消息的生产者和消费 者,QueueSender的send方法和TopicPublisher的publish方法发送消息到Destination。 QueueReciever和TopicSubscriber直接使用父接口MessageConsumer中定义的方法receive、 recieveNoWait等方法来接收消息,setMessageListener方法来设置消息监听器。QueueReciever的 getQueue方法得到Queue的引用,TopicSubscriber的getTopic方法得到Topic的引用。

  MessageListener,消息监听器。改接口只有一个方法onMessage(),改方法只有一个Message类型的参数,通过 MessageConsumer(QueueReciever和TopicSubscriber共同的父接口)的setMessageListener方法注册后,系统在收到消息后调用方法。  

  Queue和Topic,消息Destination。主要的作用就是存储消息。

package com.learn;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.InitialContext;

/**
* EventReceiver
*/
@Stateless(mappedName = EventReporterRemote.JNDI_NAME)
@Remote(EventReporterRemote.class)
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class EventHandler implements EventReporterRemote {
    private static String destinationName = "/queue/MessageQueue";
    private QueueConnection queueConnection = null;
    private QueueSession queueSession = null;
    private Queue queue = null;

    @Override
    public void notify(Event event) {
        TO to = event.getEventTO();
        if (to == null) {
            System.out.println("Unable to get data from this event "
                    + event.getEventType());
        }
        Message msg = null;
        switch (event.getEventType()) {
        case CREATE:
            msg = new Message(Message.Type.CREATE, to);
            break;
        case DELETE:
            msg = new Message(Message.Type.DELETE, pto);
            break;
        default:
            System.out.println("Wrong event type from this event "
                    + event.getEventType().toString());
        }
        if (msg != null) {
            sendMessage(msg);
        }
    }

    @PostConstruct
    private void init() {
        initQueue();
    }

    private void initQueue() {
        InitialContext ctx = null;
        try {
            ctx = new InitialContext();
            QueueConnectionFactory cf = (QueueConnectionFactory) ctx
                    .lookup("java:/ConnectionFactory");
            queue = (Queue) ctx.lookup(destinationName);
            try {
                if (queueConnection != null)
                    queueConnection.close();
                queueConnection = null;
            } catch (Exception ex) {
                System.out.println("Closing queueConnection error.");
            }
            queueConnection = cf.createQueueConnection();
            queueSession = queueConnection.createQueueSession(false,
                    Session.AUTO_ACKNOWLEDGE);
            queueConnection.start();
        } catch (Exception e) {
            System.out.println("Lookup ConnectionFactory error.", e);
            try {
                if (queueConnection != null)
                    queueConnection.close();
            } catch (JMSException ignored) {
                System.out.println("This Exception should be ignored.");
            }
            queueConnection = null;
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (Exception e) {
                    System.out.println("Failed in closing context.", e);
                }
            }
        }
    }

    @PreDestroy
    private void closeConnection() {
        try {
            if (queueConnection != null) {
                queueConnection.close();
            }
        } catch (JMSException jmse) {
            System.out.println("Could not close connection.", jmse);
        }
    }

    private void sendMessage(Message message) {
        try {
            System.out.println("Send message:" + message.getMessageType());
            if (queueConnection == null || queueSession == null) {
                initQueue();
            }
            if (queueConnection != null || queueSession != null) {
                final ObjectMessage message = queueSession
                        .createObjectMessage(message);
                QueueSender publisher = queueSession.createSender(queue);
                publisher.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
                publisher.send(message);
            } else {
                System.out.println("No available message queue.");
            }
        } catch (Exception ex) {
            System.out.println("Failed to send message to queue." + ex);
        }
    }
}
1
2
分享到:
评论
2 楼 lvwenwen 2013-09-29  
上传工程吧,找包很麻烦的
1 楼 2896223031 2013-09-29  
 

相关推荐

    JMS完全实例(八个实例)

    通过这八个实例的学习,你将能够全面掌握JMS的核心特性和使用方式,理解其在实际项目中的应用,提升你在企业级应用开发中的消息处理能力。同时,结合Spring框架的使用,能让你更好地在实际工作中利用JMS实现高效、...

    activeMQ-JMS实例

    在本文中,我们将深入探讨如何使用Spring MVC框架与ActiveMQ结合实现JMS(Java Message Service)实例。首先,让我们理解ActiveMQ和JMS的基本概念。 ActiveMQ是Apache软件基金会开发的一款开源消息代理,它实现了...

    ActiveMq-JMS简单实例使用tomcat.doc

    在本文中,我们将探讨如何在Tomcat服务器上设置和使用ActiveMQ的简单实例。 **一、ActiveMQ的特点与优势** 1. **遵循JMS1.1规范**,兼容J2EE1.4及以上版本。 2. **跨平台**,可以在任何JVM和大多数Web容器中运行,...

    JBOSS建立JMS应用实例

    【JBOSST建立JMS应用实例】 JBOSST(Java Business Open Source Solutions)是一个开源的企业级应用服务器,它提供了全面的中间件服务,包括对Java消息服务(JMS)的支持。JMS是一种标准,用于在分布式环境中传递...

    JMS消息队列机制及案例

    - **订单处理**:当大量订单涌入时,使用JMS队列可以避免系统因处理能力不足而崩溃。订单作为消息放入队列,后台处理系统按照队列顺序逐个处理,保证业务的连续性。 - **日志记录**:分布式系统中的日志收集可以...

    JMS经典实例 基于weblogic

    在实现JMS实例时,你可以采用编程模型或声明式模型。编程模型需要在代码中显式创建和管理JMS资源,而声明式模型通过WebLogic管理控制台或XML配置文件完成资源配置。 例如,一个简单的JMS生产者可能会创建一个消息,...

    JMS整合Spring实例

    下面将详细介绍如何整合JMS与Spring,以及一个简单的实例。 ### 1. 添加依赖 首先,你需要在项目的构建文件(如Maven的pom.xml或Gradle的build.gradle)中添加JMS和Spring的依赖。通常,这包括JMS API、一个JMS...

    javax.jms.jar包与JMS实例代码

    总结起来,`javax.jms.jar` 包提供了Java开发人员与JMS兼容的消息中间件进行通信的工具,而`demo` 文件中的实例代码展示了如何在实际应用中使用这些工具。通过学习和实践这些示例,你可以更好地理解和掌握Java消息...

    Java-JMS实例

    Java Message Service (JMS) 是Java平台中用于在分布式环境中交换异步消息的标准API。它为应用程序提供了一种可靠和高效的方式来发送、接收和管理消息,这些消息可以在不同的应用程序之间传输,甚至跨越不同的网络和...

    JMS简单示例1

    在"JMS示例"中,通常会展示如何创建一个简单的消息生产和消费流程: 1. **创建连接工厂(ConnectionFactory)**:这是连接到消息代理的桥梁,JMS API提供创建连接工厂的方法。 2. **创建连接(Connection)**:...

    test_jms.zip_activemq_activemq案例_jms_jms test

    描述"jms简单的案例,用的activemq,使用jms前请先启动activemq服务器"表明这是一个初级的JMS实践,涉及到使用ActiveMQ作为服务器,而且在运行任何JMS相关的代码之前,需要确保ActiveMQ服务已经启动。 **ActiveMQ与...

    ActiveMq-JMS简单实例

    在这个"ActiveMQ-JMS简单实例"中,我们将探讨如何在Tomcat服务器上部署并使用ActiveMQ,以及通过代码实现JMS的基本功能。 首先,让我们了解ActiveMQ的核心概念。ActiveMQ作为消息代理,它接收和转发消息,提供持久...

    java-jms小例子

    5. **示例代码**:在“jmstest”文件中,可能包含了一个简单的Java程序,它创建了生产者和消费者,并使用`ActiveMQ`这样的JMS提供商作为消息中间件。生产者会发送一个`TextMessage`到一个队列或主题,而消费者则监听...

    JMS实例,整合spring,含jar

    Spring框架是一个广泛使用的Java开发框架,它提供了对JMS的全面支持,使得集成和管理消息变得更加简单。 本实例中,"JMS实例,整合spring,含jar"表明这是一个具体的项目示例,展示了如何在Spring框架中配置和使用JMS...

    JMS-ActiveMQ入门实例

    本实例将带领初学者了解如何使用JMS和ActiveMQ构建一个简单的消息传递系统。首先,我们需要安装以下软件包: 1. **tokyocabinet-1.4.45.tar.gz**: 这是一个高效的键值存储库,通常用于数据缓存和日志记录。在...

    ActiveMq-JMS简单实例使用tomcat.pdf

    【ActiveMQ-JMS简单实例使用Tomcat】是一个关于如何在Tomcat环境下集成并使用ActiveMQ进行JMS消息传递的初级教程。ActiveMQ是一款开源的消息中间件,它遵循JMS(Java Message Service)1.1规范,能兼容J2EE1.4及以上...

    JMS消息发送及订阅

    在提供的"jmsCamel"压缩包中,可能包含了一些示例代码或配置文件,演示了如何使用Apache Camel结合JMS进行消息发送和订阅。通过阅读和理解这些示例,你可以更好地掌握JMS和Camel在实际项目中的应用。 总之,JMS提供...

    JMS入门小例子以及weblogic安装,并且在weblogic中配置JMS服务

    总的来说,JMS入门实例结合WebLogic的安装和配置,为初学者提供了一个了解和实践Java消息服务的完整流程。通过这个过程,开发者可以学习到如何在WebLogic这样的企业级应用服务器上构建可靠的消息传递系统,以及如何...

    jboss服务器下的jms实例

    【JBoss 服务器下的 JMS 实例】 Java 消息服务 (JMS) 是 Java 平台中用于处理异步消息传递的标准API,它在面向服务架构 (SOA) 中扮演着关键角色,特别是在需要与外部系统进行异步通信的企业环境中。JBoss 服务器...

    Weblogic创建JMS服务器

    WebLogic Server是一款由Oracle公司提供的企业级Java应用服务器,它支持Java ...同时,熟悉源码和工具的使用能帮助你更好地诊断和优化JMS服务器的性能。在实际操作中,一定要遵循最佳实践,确保系统的稳定性和安全性。

Global site tag (gtag.js) - Google Analytics