深入掌握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的话,无法确定一个消息最终会被哪一个消费者消费。
分享到:
相关推荐
- JMS相关的导入:如`javax.jms.Message`和`javax.jms.MessageListener`等。 - JNDI查找:获取JMS连接工厂和目的地的引用。 **5. 示例代码详解** 由于具体源码未给出,这里只能给出一个通用的示例。一个简单的MDB...
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.MessageListener.class javax.jms.MessageNotReadableException.class javax.jms.MessageNotWriteableException.class javax.jms.MessageProducer.class javax.jms.ObjectMessage.class javax.jms.Queue....
<property name="messageListener" ref="messageListener" /> ``` **五、编写生产者和消费者** 1. **生产者**:使用Spring的JmsTemplate发送消息。 2. **消费者**:实现MessageListener接口,重写onMessage方法...
public class ExampleMessageListener implements MessageListener { @Override public void onMessage(Message message) { // 处理接收到的消息 } } ``` #### 四、总结 将Sun的Open Message Queue与Spring...
- **MessageListenerContainer**:通过实现`MessageListener`接口,Spring容器会自动启动监听线程,接收到消息后调用监听器方法。 - **JmsTemplate.receive()**:阻塞式接收,调用后会等待直到有消息到达。 **7. ...
JMS提供了MessageListener接口,实现该接口的类可以在接收到消息时自动触发回调方法,实现异步处理。 5. 示例源码: 假设我们有一个名为`SampleProducer.java`的生产者类,它创建并发送JMS消息到队列或主题: ```...
- 消费者代码(Consumer)通常包含一个实现了`MessageListener`接口的类,这个类会被Spring容器自动初始化,并通过`<jms:listener-container>`配置绑定到特定的Destination。 6. **消息模型** SpringJMS支持两种...
- **异步消费**:消费者注册一个消息监听器(MessageListener),当消息到达时,系统自动调用监听器的`onMessage()`方法。 #### 五、JMS编程模型 JMS的编程模型主要包括以下几个核心组件: - **ConnectionFactory...
2. **异步**:应用程序可以通过注册一个`MessageListener`,当消息到达时,系统自动调用`MessageListener`的`onMessage()`方法。 #### 七、开发示例 下面是一个简单的JMS发送消息程序示例: ```java ...
总结起来,"JMS之Spring + ActiveMQ实现消息队列"涉及到的关键知识点包括:Spring框架的JMS支持、ActiveMQ的使用、ConnectionFactory的配置、JmsTemplate和MessageListener的实现,以及消息队列在解决系统解耦和异步...
- **MessageListener接口**:理解消息监听器如何工作,如何实现onMessage()方法来处理接收到的消息。 - **ConnectionFactory**:研究如何配置和创建ConnectionFactory,它是与消息中间件建立连接的关键。 - **...
**正文** 在IT行业中,Java消息服务(Java Message Service,JMS)是一种标准接口,用于在应用程序之间交换异步消息。它提供了一种可靠的消息...通过深入研究该项目,可以掌握JMS和Spring集成的关键技术和最佳实践。
<property name="messageListener" ref="messageListener"/> ``` 上述配置创建了一个连接工厂,指定了目的地,并定义了一个消息监听器容器,该容器会从队列中拉取消息并分发给消息监听器处理。 4. **消息的...
`messageHandler`是处理消息的类,需要实现`MessageListener`接口并提供`onMessage`方法。 **5. 示例代码解析** 压缩包中的`SpringActiveMQCustomer`和`SpringActiveMQProvide`两个文件分别代表了消费者和生产者的...
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="messageListener" ref="messageListener"/> ``` 5. **编写消息生产者...
同时,Spring的JMS监听容器会自动启动并开始监听`MyQueue`,当有新消息到达时,`MessageListener`会接收到消息并进行处理。 总结一下,这个“activemq的queue队列模式的maven,spring的demo”主要展示了如何利用...
<bean id="messageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="messageListener" ref="messageListener" /> <bean id="messageListener...
`MyMessageListener`是你自定义的类,实现了`javax.jms.MessageListener`接口,其中的`onMessage(Message message)`方法会在接收到消息时被调用。 发送消息同样简单,我们创建一个`JmsTemplate`实例,调用`...
8. **消息监听器(MessageListener)**:通过实现MessageListener接口,消费者可以在接收到消息时自动调用onMessage()方法,实现异步处理。 在JMS技术文档中,你可能会找到关于如何设置JMS环境、创建连接工厂、建立...