消息规范里面定义最常见的几种消息通信模式主要有publish-subscribe(发布订阅模式),p2p(点对点)这两种。
Consumer.java



区别:publish-subscribe和p2p区别在于一个发布订阅的topic有一个发送者和多个接收者,而在p2p里一个queue只有一个发送者和一个接收者。
1.publish-subscribe(发布订阅模式)
Publisher.java
package com.wangzs.publishSubscribe;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.Message;
import org.apache.activemq.command.ActiveMQMapMessage;
/**
* @Title 发布者
* @Description 发布主题
* @author wangzs
* @date 2016-4-26
*/
public class Publisher {
private String user;
private String password;
private String url;
private ConnectionFactory connectionFactory = null; // 连接工厂,客户用来创建连接的对象
private Connection connection = null; // 封装了客户与 JMS 提供者之间的一个虚拟的连接
private Session session = null; // 生产和消费消息的一个单线程上下文
private MessageProducer producer = null; // 消息生产者
private Destination[] destinations; // // 指定它生产的消息的目标和它消费的消息的来源的对象
public Publisher() {
super();
}
public Publisher(String user, String password, String url) {
super();
this.user = user;
this.password = password;
this.url = url;
}
public static void main(String[] args) throws JMSException, InterruptedException {
Publisher publisher = new Publisher(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
ActiveMQConnection.DEFAULT_BROKER_URL);
publisher.initialize();
String[] topics = { "A", "B", "C", "D" };// 发布主题
publisher.setTopic(topics);
for (int i = 0; i < 10; i++) {// 给主题发送10次消息
publisher.sendMessage(topics);
Thread.sleep(1000);
}
publisher.close();
}
// 初始化
public void initialize() throws JMSException {
connectionFactory = new ActiveMQConnectionFactory(this.getUser(), this.getPassword(), this.getUrl());
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(null);
}
// 定义一系列的topic让所有的consumer来订阅
protected void setTopic(String[] topics) throws JMSException {
destinations = new Destination[topics.length];
for (int i = 0; i < topics.length; i++) {
destinations[i] = session.createTopic("TOPIC." + topics[i]);
}
}
// 在定义好topic之后我们要给这些指定的topic发消息
protected void sendMessage(String[] topics) throws JMSException {
for (int i = 0; i < topics.length; i++) {
Message message = createStockMessage(topics[i], session);
System.out.println("#####Sending: " + ((ActiveMQMapMessage) message).getContentMap() + " --> destination: "
+ destinations[i]);
System.out.println("-----------------------------------");
producer.send(destinations[i], message);
}
}
// 给每个主题创建消息
protected Message createStockMessage(String topic, Session session) throws JMSException {
MapMessage message = null;
message = session.createMapMessage();
message.setString("topic", topic);
message.setDouble("price", Math.random() * 100);
message.setDouble("offer", 0.01);
message.setBoolean("up", true);
return (Message) message;
}
// 关闭连接
public void close() throws JMSException {
if (connection != null) {
connection.close();
}
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
Consumer.java
package com.wangzs.publishSubscribe;
import java.text.DecimalFormat;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* @Title 订阅者
* @Description 订阅发布过的主题
* @author wangzs
* @date 2016-4-26
*/
public class Consumer implements MessageListener {
private String user;
private String password;
private String url;
private ConnectionFactory connectionFactory = null; // 连接工厂,客户用来创建连接的对象
private Connection connection = null; // 封装了客户与 JMS 提供者之间的一个虚拟的连接
private Session session = null; // 生产和消费消息的一个单线程上下文
public Consumer() {
super();
}
public Consumer(String user, String password, String url) {
super();
this.user = user;
this.password = password;
this.url = url;
}
public static void main(String[] args) throws JMSException {
Consumer consumer = new Consumer(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,
ActiveMQConnection.DEFAULT_BROKER_URL);
consumer.initialize();
String[] topics = { "A", "C", "D" };// 订阅主题
consumer.subTopic(topics);
}
// 初始化
public void initialize() throws JMSException {
connectionFactory = new ActiveMQConnectionFactory(this.getUser(), this.getPassword(), this.getUrl());
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}
// 订阅主题
public void subTopic(String[] topics) throws JMSException {
for (String topic : topics) {
Destination destination = session.createTopic("TOPIC." + topic);
MessageConsumer messageConsumer = session.createConsumer(destination);
messageConsumer.setMessageListener(this);
}
}
@Override
public void onMessage(Message message) {
try {
MapMessage map = (MapMessage) message;
String stock = map.getString("topic");
double price = map.getDouble("price");
double offer = map.getDouble("offer");
boolean up = map.getBoolean("up");
DecimalFormat df = new DecimalFormat("#,###,###,##0.00");
System.out.println(stock + "\t" + df.format(price) + "\t" + df.format(offer) + "\t" + (up ? "up" : "down"));
System.out.println("-----------------------------------");
} catch (Exception e) {
e.printStackTrace();
}
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
2.p2p(点对点)
http://blog.youkuaiyun.com/adam_wzs/article/details/51145800
http://blog.youkuaiyun.com/adam_wzs/article/details/51250177
http://blog.youkuaiyun.com/adam_wzs/article/details/51250177
3.运行结果
4.参考资料
http://shmilyaw-hotmail-com.iteye.com/blog/1897635