使用第二种方式接收消息—注册监听器
首先建立一个class, 这个class 必须实现 MessageListener接口.
package com.zero.activemq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 实现messageListener接口
* @author samuel
*
*/
public class Listener1 implements MessageListener {
/**
* 传输的消息
*/
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage txtMsg = (TextMessage) message;
String msg = txtMsg.getText();
System.out.println("Received: " + msg);
} else {
System.out.println("this is error");
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
其次创建消费者类, 该类和第一种消费者类基本上是一样的, 不同的地方就是在接收消息的方式上不同.
package com.zero.activemq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 创建消息并发送消息
*
* 测试失败 没有找出问题在哪里
* @author samuel
*
*/
public class ActiveConsumer2 {
// 系统默认的 用户名称 用户密码 连接地址
private static final String USER_NAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROKE_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public void run() {
ConnectionFactory connectionFactory = null;
Connection connection = null;
Session session;
Destination destination;
MessageConsumer messageConsumer;
try {
// 实例化activemq的工厂
connectionFactory = new ActiveMQConnectionFactory(USER_NAME, PASSWORD, BROKE_URL);
// 使用对象工厂创建连接对象
connection = connectionFactory.createConnection();
connection.start();
// 使用连接对象创建Session
/*
* @parms true: true 开始session服务 false 不需要session
* @parms Session.AUTO_ACKNOWLEDGE 自动接收消息 有四种类似
*/
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建消息队列
destination = session.createQueue("firstQueue");
// 创建消息消费者
messageConsumer = session.createConsumer(destination);
// 设置监听器接收消息
messageConsumer.setMessageListener(new Listener1());
/**
* 对比第一种的接收消息方式
*/
/*
while (true) {
// 这个时间但是是 毫秒
TextMessage textMessage = (TextMessage) messageConsumer.receive(100000);
if(null != textMessage) {
System.out.println(textMessage.getText());
} else {
System.out.println("111111");
}
}*/
}catch (Exception e) {
e.printStackTrace();
}finally {
// /****一定不能 connection.close()****/
}
}
public static void main(String[] args) {
new ActiveConsumer2().run();
}
}
注意点:
使用注册监听器的方式 一定不能关闭connection对象. 否则就接收不到消息