ActiveMQ总结

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

区别: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

3.运行结果







4.参考资料

http://shmilyaw-hotmail-com.iteye.com/blog/1897635


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值