衔接上一个项目(不同包)
consumerListener代码段
package com.project.listener;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 使用监听器的方式,实现消息的处理[消费]
* @author Administrator
*
*/
public class ConsumerListener {
public void consumeMessage(){
ConnectionFactory factory = null;
Connection connection = null;
Session session = null;
Destination destination = null;
MessageConsumer consumer = null;
try{
factory = new ActiveMQConnectionFactory("admin","admin",
"tcp://192.168.0.109:61616");
connection = factory.createConnection();
connection.start();
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
destination = session.createQueue("test-listener");
consumer = session.createConsumer(destination);
//注册监听器。注册成功后,队列中的消息变化会自动触发监听器代码,接收消息并处理
consumer.setMessageListener(new MessageListener() {
/**
* 监听器一旦注册,永久不失效
* 永久-consumer线程不关闭
* 处理消息的方式:只要有消息未处理,自动调用onMessage方法,处理消息
* 监听器可以注册若干。注册多个监听器,相当于集群
* ActiveMQ自动轮询多个监听器,处理队列中的消息,实现并行处理。
*
* 处理消息的方法,就是监听的方法
* 监听的事件是:消息,消息未处理
* 要处理的具体内容:消息处理
* @param message - 未处理的消息
*/
@Override
public void onMessage(Message message) {
try{
//acknowledge方法,就是确认方法,代表consumer已经收到消息。确认后,MQ删除对应消息
message.acknowledge();
ObjectMessage om = (ObjectMessage) message;
Object data = om.getObject();
System.out.println(data);
}catch(Exception e){
e.printStackTrace();
}
}
});
//阻塞当前代码,保证listener代码未结束。如果代码结束了,监听器自动关闭
System.in.read();
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(consumer != null) consumer.close();
if(session != null) session.close();
if(connection != null) connection.close();
}catch(Exception e){}
}
}
public static void main(String[] args) {
ConsumerListener listener = new ConsumerListener();
listener.consumeMessage();
}
}
运行两次consumerListener,界面效果:
producer代码段
package com.project.listener;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
public class ObjectProducer {
public void sendMessage(Object obj){
ConnectionFactory factory = null;
Connection connection = null;
Session session = null;
Destination destination = null;
MessageProducer producer = null;
Message message = null;
try {
factory = new ActiveMQConnectionFactory("admin","admin",
"tcp://192.168.0.109:61616");
connection = factory.createConnection();
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
destination = session.createQueue("test-listener");
producer = session.createProducer(destination);
connection.start();
//批量发送消息
for(int i=0; i<100; i++){
Integer data = i;
message = session.createObjectMessage(data);
producer.send(message);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if(producer != null) producer.close();
if(session != null) session.close();
if(connection !=null) connection.close();
}catch(Exception e){}
}
}
public static void main(String[] args) {
ObjectProducer producer = new ObjectProducer();
producer.sendMessage(null);
}
}
界面效果:
多个监听器类似于消费集群,消息轮询消费
注:如果客户端要求consumer消息确认,那消费消息是必须确认(acknowleage方法),否则消息未处理相当于消息没有处理,可能会出现重复消息的问题