`
xfjt297857539
  • 浏览: 152367 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

深入掌握JMS(三):MessageListener Queue

    博客分类:
  • java
 
阅读更多
深入掌握JMS(三):MessageListener   Queue

消息的消费者接收消息可以采用两种方式:
1、consumer.receive() 或 consumer.receive(int timeout);
2、注册一个MessageListener。
采用第一种方式,消息的接收者会一直等待下去,直到有消息到达,或者超时。后一种方式会注册一个监听器,当有消息到达的时候,会回调它的onMessage()方法。下面举例说明:

MessageConsumer comsumer = session.createConsumer(queue);
comsumer.setMessageListener(new MessageListener(){
            @Override
            public void onMessage(Message m) {
                TextMessage textMsg = (TextMessage) m;
                try {
                    System.out.println(textMsg.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

        });


Queue实现的是点到点模型,在下面的例子中,启动2个消费者共同监听一个Queue,然后循环给这个Queue中发送多个消息,我们依然采用ActiveMQ。
import javax.jms.Connection;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;

public class QueueTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");

        Connection connection = factory.createConnection();
        connection.start();

        //创建一个Queue
        Queue queue = new ActiveMQQueue("testQueue");

        //创建一个Session
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //注册消费者1
        MessageConsumer comsumer1 = session.createConsumer(queue);
        comsumer1.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer1 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        //注册消费者2
        MessageConsumer comsumer2 = session.createConsumer(queue);
        comsumer2.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer2 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

        });

        //创建一个生产者,然后发送多个消息。
        MessageProducer producer = session.createProducer(queue);
        for(int i=0; i<10; i++){
            producer.send(session.createTextMessage("Message:" + i));
        }
    }

}

运行这个例子会得到下面的输出结果:
Consumer1 get Message:0
Consumer2 get Message:1
Consumer1 get Message:2
Consumer2 get Message:3
Consumer1 get Message:4
Consumer2 get Message:5
Consumer1 get Message:6
Consumer2 get Message:7
Consumer1 get Message:8
Consumer2 get Message:9
可以看出每个消息直被消费了一次,但是如果有多个消费者同时监听一个Queue的话,无法确定一个消息最终会被哪一个消费者消费。
分享到:
评论

相关推荐

    java源码:Message-Driven Bean EJB实例源代码.zip

    - JMS相关的导入:如`javax.jms.Message`和`javax.jms.MessageListener`等。 - JNDI查找:获取JMS连接工厂和目的地的引用。 **5. 示例代码详解** 由于具体源码未给出,这里只能给出一个通用的示例。一个简单的MDB...

    javax.jms.jar

    javax.jms.MessageListener.class javax.jms.MessageProducer.class javax.jms.MessageConsumer.class javax.jms.Queue.class javax.jms.TopicSubscriber.class javax.jms.QueueBrowser.class javax.jms....

    javax.jms.jar下载

    javax.jms.MessageListener.class javax.jms.MessageNotReadableException.class javax.jms.MessageNotWriteableException.class javax.jms.MessageProducer.class javax.jms.ObjectMessage.class javax.jms.Queue....

    Spring 和 activemq 搭建JMS开发系统示例

    &lt;property name="messageListener" ref="messageListener" /&gt; ``` **五、编写生产者和消费者** 1. **生产者**:使用Spring的JmsTemplate发送消息。 2. **消费者**:实现MessageListener接口,重写onMessage方法...

    将Sun的Open Message Queue与Spring集成

    public class ExampleMessageListener implements MessageListener { @Override public void onMessage(Message message) { // 处理接收到的消息 } } ``` #### 四、总结 将Sun的Open Message Queue与Spring...

    spring-jms入门

    - **MessageListenerContainer**:通过实现`MessageListener`接口,Spring容器会自动启动监听线程,接收到消息后调用监听器方法。 - **JmsTemplate.receive()**:阻塞式接收,调用后会等待直到有消息到达。 **7. ...

    JMS实例 实例源码 点对点 主题 同步异步

    JMS提供了MessageListener接口,实现该接口的类可以在接收到消息时自动触发回调方法,实现异步处理。 5. 示例源码: 假设我们有一个名为`SampleProducer.java`的生产者类,它创建并发送JMS消息到队列或主题: ```...

    SpringJMS示例代码

    - 消费者代码(Consumer)通常包含一个实现了`MessageListener`接口的类,这个类会被Spring容器自动初始化,并通过`&lt;jms:listener-container&gt;`配置绑定到特定的Destination。 6. **消息模型** SpringJMS支持两种...

    深入浅出JMS-JMS介绍说明文档

    - **异步消费**:消费者注册一个消息监听器(MessageListener),当消息到达时,系统自动调用监听器的`onMessage()`方法。 #### 五、JMS编程模型 JMS的编程模型主要包括以下几个核心组件: - **ConnectionFactory...

    JMS--J2EE培训材料

    2. **异步**:应用程序可以通过注册一个`MessageListener`,当消息到达时,系统自动调用`MessageListener`的`onMessage()`方法。 #### 七、开发示例 下面是一个简单的JMS发送消息程序示例: ```java ...

    JMS之Spring +activeMQ实现消息队列

    总结起来,"JMS之Spring + ActiveMQ实现消息队列"涉及到的关键知识点包括:Spring框架的JMS支持、ActiveMQ的使用、ConnectionFactory的配置、JmsTemplate和MessageListener的实现,以及消息队列在解决系统解耦和异步...

    java jms 源码都在其中

    - **MessageListener接口**:理解消息监听器如何工作,如何实现onMessage()方法来处理接收到的消息。 - **ConnectionFactory**:研究如何配置和创建ConnectionFactory,它是与消息中间件建立连接的关键。 - **...

    jms整合spring工程

    **正文** 在IT行业中,Java消息服务(Java Message Service,JMS)是一种标准接口,用于在应用程序之间交换异步消息。它提供了一种可靠的消息...通过深入研究该项目,可以掌握JMS和Spring集成的关键技术和最佳实践。

    ActiveMQ学习笔记(二) JMS与Spring

    &lt;property name="messageListener" ref="messageListener"/&gt; ``` 上述配置创建了一个连接工厂,指定了目的地,并定义了一个消息监听器容器,该容器会从队列中拉取消息并分发给消息监听器处理。 4. **消息的...

    spring_activeMQ

    `messageHandler`是处理消息的类,需要实现`MessageListener`接口并提供`onMessage`方法。 **5. 示例代码解析** 压缩包中的`SpringActiveMQCustomer`和`SpringActiveMQProvide`两个文件分别代表了消费者和生产者的...

    spring中集成JMS使用工程实例..eclipse项目例子,带注解.导入即可运行.

    &lt;bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt; &lt;property name="messageListener" ref="messageListener"/&gt; ``` 5. **编写消息生产者...

    activemq的queue队列模式的maven,spring的demo

    同时,Spring的JMS监听容器会自动启动并开始监听`MyQueue`,当有新消息到达时,`MessageListener`会接收到消息并进行处理。 总结一下,这个“activemq的queue队列模式的maven,spring的demo”主要展示了如何利用...

    Spring JMS消息处理-不基于JNDI

    &lt;bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt; &lt;property name="messageListener" ref="messageListener" /&gt; &lt;bean id="messageListener...

    Spring整合JMS——实现收发消息

    `MyMessageListener`是你自定义的类,实现了`javax.jms.MessageListener`接口,其中的`onMessage(Message message)`方法会在接收到消息时被调用。 发送消息同样简单,我们创建一个`JmsTemplate`实例,调用`...

    JMS.rar_jms

    8. **消息监听器(MessageListener)**:通过实现MessageListener接口,消费者可以在接收到消息时自动调用onMessage()方法,实现异步处理。 在JMS技术文档中,你可能会找到关于如何设置JMS环境、创建连接工厂、建立...

Global site tag (gtag.js) - Google Analytics