下面咱们就来说说怎么创建发布–订阅消息. 发布消息和订阅消息其实很简单, 基本上合创建队列是一样的. 不一样的地方就是把创建的队列的修改成创建主题就行了. 其他的都是一样的. 这里我会使用注册监听器的方式接收消息.
创建两个监听器 模拟两个用户订阅这个消息
package com.zero.activemq2;
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__01: " + msg);
} else {
System.out.println("this is error");
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
// 第二个监听器
package com.zero.activemq2;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
/**
* 实现messageListener接口
* 第二个监听器
* @author samuel
*
*/
public class Listener2 implements MessageListener {
/**
* 传输的消息
*/
public void onMessage(Message message) {
try {
if (message instanceof TextMessage) {
TextMessage txtMsg = (TextMessage) message;
String msg = txtMsg.getText();
System.out.println("Received: __02" + msg);
} else {
System.out.println("this is error");
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
创建一个发布者的类
package com.zero.activemq2;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 发布消息
* @author samuel
*
*/
public class Publisher {
private static final String USER_NAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;
Connection connection;
Session session;
Destination destination;
MessageProducer messageProducer;
connectionFactory = new ActiveMQConnectionFactory(USER_NAME, PASSWORD, BROER_URL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
// 创建主题
destination = session.createTopic("firstTopic");
messageProducer = session.createProducer(destination);
sendMessage(session, messageProducer);
session.commit();
connection.close();
}
/**
* 发送信息
* @param session JMS的Session对象
* @param messageProducer 消息发布者对象
* @throws JMSException
*/
private static void sendMessage(Session session, MessageProducer messageProducer) throws JMSException {
for (int i = 0; i < 10; i++) {
TextMessage textMessage = session.createTextMessage("activemq"+i);
System.out.println("发布消息==>activemq" + i);
messageProducer.send(textMessage);
}
}
}
创建两个订阅者
// 第一个订阅者
package com.zero.activemq2;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消费者--订阅者1
* @author samuel
*
*/
public class Cusouer1 {
private static final String USER_NAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;
Connection connection;
Session session;
Destination destination;
MessageConsumer messageConsumer;
connectionFactory = new ActiveMQConnectionFactory(USER_NAME, PASSWORD, BROER_URL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建主题
destination = session.createTopic("firstTopic");
messageConsumer = session.createConsumer(destination);
// 接收消息
messageConsumer.setMessageListener(new Listener1());
}
}
// 第二个订阅者
package com.zero.activemq2;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消费者--订阅者2
* @author samuel
*
*/
public class Cusouer2 {
private static final String USER_NAME = ActiveMQConnection.DEFAULT_USER;
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
private static final String BROER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory;
Connection connection;
Session session;
Destination destination;
MessageConsumer messageConsumer;
connectionFactory = new ActiveMQConnectionFactory(USER_NAME, PASSWORD, BROER_URL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 创建主题
destination = session.createTopic("firstTopic");
messageConsumer = session.createConsumer(destination);
// 接收消息
messageConsumer.setMessageListener(new Listener2());
}
}