JMS之ActiveMQ--发布-订阅消息模式(一对多)实现

1.创建消息发布者

/**  
* <p>Title: MessageProducer.java</p>  
* <p>Description: </p>   
* @author lihongjie  
* @date 2018年7月15日  
* @version 1.0  
*/  
package com.zit.mq2;

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;

/**  
* <p>Title: MessageProducer</p>  
* <p>Description:消息生产者--消息发布者 </p>  
* @author lihongjie  
* @date 2018年7月15日  
*/
public class MyMessageProducer { 
	// 默认的连接用户名
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	// 默认的连接密码
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	// 默认的连接地址
	private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
	// 发送的消息数量
	private static final int SENDNUM=10; 
	
	public static void main(String[] args) {
		//连接工厂
		ConnectionFactory connectionFactory; 
		//连接
		Connection connection = null;
		
		Session session ;// 会话 接受或者发送消息的线程
		Destination destination ;//消息的目的地
		MessageProducer messageProducer ;//消息生产者
		
		//实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
		
		try {
			//通过连接工厂获取连接
			connection = connectionFactory.createConnection();
			//启动连接
			connection.start();
			
			session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
			//创建消息订阅者
			destination = session.createTopic("Topic1");
			//创建消息生产者
			messageProducer = session.createProducer(destination);
			//发送消息
			sendMessage(session, messageProducer);
			session.commit();
		} catch (JMSException e) {
			e.printStackTrace();
		}
		//关闭资源
		finally {
			if(null != connection)
				try {
					connection.close();
				} catch (JMSException e) {
					e.printStackTrace();
				}
		}
		
		
	}
	/**
	 * 
	 * <p>Title: sendMessage</p>  
	 * <p>Description: 发送消息</p>  
	 * @param session
	 * @param messageProducer
	 */
	public static void sendMessage(Session session, MessageProducer messageProducer) {
		try {
			for (int i = 0; i < SENDNUM; i++) {
				TextMessage textMessage = session.createTextMessage("ActiveMQ发布的第"+i+"条消息!");
				System.out.println("发布消息"+i+"条!");
				messageProducer.send(textMessage);
			}
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
}

2.创建监听

2.1创建订阅者1的监听

/**  
* <p>Title: MyListener.java</p>  
* <p>Description: </p>   
* @author lihongjie  
* @date 2018年7月15日  
* @version 1.0  
*/  
package com.zit.mq2;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**  
* <p>Title: MyListener</p>  
* <p>Description:消息监听--订阅者1 </p>  
* @author lihongjie  
* @date 2018年7月15日  
*/
public class MyListener implements MessageListener {

	/* (non-Javadoc)  
	 * <p>Title: onMessage</p>  
	 * <p>Description: </p>  
	 * @param message  
	 * @see javax.jms.MessageListener#onMessage(javax.jms.Message)  
	 */
	@Override
	public void onMessage(Message message) {
		
		try {
			System.out.println("通过监听,监听订阅者1收到的消息:"+((TextMessage)message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}

	}

}

2.2创建订阅者2的监听

/**  
* <p>Title: MyListener.java</p>  
* <p>Description: </p>   
* @author lihongjie  
* @date 2018年7月15日  
* @version 1.0  
*/  
package com.zit.mq2;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**  
* <p>Title: MyListener</p>  
* <p>Description:消息监听--订阅者2 </p>  
* @author lihongjie  
* @date 2018年7月15日  
*/
public class MyListener2 implements MessageListener {

	/* (non-Javadoc)  
	 * <p>Title: onMessage</p>  
	 * <p>Description: </p>  
	 * @param message  
	 * @see javax.jms.MessageListener#onMessage(javax.jms.Message)  
	 */
	@Override
	public void onMessage(Message message) {
		
		try {
			System.out.println("通过监听,监听订阅者2收到的消息:"+((TextMessage)message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}

	}

}



3.创建消息消费者--(订阅者)

3.1订阅者1

/**  
* <p>Title: MessageProducer.java</p>  
* <p>Description: </p>   
* @author lihongjie  
* @date 2018年7月15日  
* @version 1.0  
*/  
package com.zit.mq2;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**  
* <p>Title: MessageProducer</p>  
* <p>Description:消息消费者 --订阅者1</p>  
* @author lihongjie  
* @date 2018年7月15日  
*/
public class MyMessageConsumer { 
	// 默认的连接用户名
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	// 默认的连接密码
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	// 默认的连接地址
	private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
	// 发送的消息数量
	private static final int SENDNUM=10; 
	
	public static void main(String[] args) {
		//连接工厂
		ConnectionFactory connectionFactory; 
		//连接
		Connection connection = null;
		Session session ;// 会话 接受或者发送消息的线程
		Destination destination ;//消息的目的地
		MessageConsumer messageConsumer;//消息消费者
		
		//实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(MyMessageConsumer.USERNAME, MyMessageConsumer.PASSWORD, MyMessageConsumer.BROKEURL);
		
		try {
			//通过连接工厂获取连接
			connection = connectionFactory.createConnection();
			//启动连接
			connection.start();
			//创建session
			session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
			//创建消息订阅者
			destination = session.createTopic("Topic1");
			//创建消息消费者
			messageConsumer = session.createConsumer(destination);
			//接收消息--注册消息监听
			messageConsumer.setMessageListener(new MyListener());
		} catch (JMSException e) {
			e.printStackTrace();
		}
		
	}
}

3.2订阅者2

/**  
* <p>Title: MessageProducer.java</p>  
* <p>Description: </p>   
* @author lihongjie  
* @date 2018年7月15日  
* @version 1.0  
*/  
package com.zit.mq2;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

/**  
* <p>Title: MessageProducer</p>  
* <p>Description:消息消费者 --优化</p>  
* @author lihongjie  
* @date 2018年7月15日  
*/
public class MyMessageConsumer2 { 
	// 默认的连接用户名
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	// 默认的连接密码
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	// 默认的连接地址
	private static final String BROKEURL = ActiveMQConnection.DEFAULT_BROKER_URL;
	// 发送的消息数量
	private static final int SENDNUM=10; 
	
	public static void main(String[] args) {
		//连接工厂
		ConnectionFactory connectionFactory; 
		//连接
		Connection connection = null;
		Session session ;// 会话 接受或者发送消息的线程
		Destination destination ;//消息的目的地
		MessageConsumer messageConsumer;//消息消费者
		
		//实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(MyMessageConsumer2.USERNAME, MyMessageConsumer2.PASSWORD, MyMessageConsumer2.BROKEURL);
		
		try {
			//通过连接工厂获取连接
			connection = connectionFactory.createConnection();
			//启动连接
			connection.start();
			//创建session
			session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
			//创建消息订阅者
			destination = session.createTopic("Topic1");
			//创建消息消费者
			messageConsumer = session.createConsumer(destination);
			//接收消息--注册消息监听
			messageConsumer.setMessageListener(new MyListener2());
			/*TextMessage textMessage = (TextMessage)messageConsumer.receive(100000);
			System.out.println("第二个消费者,收到的消息是:"+textMessage);*/
		} catch (JMSException e) {
			e.printStackTrace();
		}
		
	}
}

4. 查看消息队列页面

java工程代码下载地址:点击前往下载

猜你喜欢

转载自blog.csdn.net/qq_37306041/article/details/81052278