ActiveMQ第一个示例

首先先安装ActiveMQ:https://www.cnblogs.com/hejianliang/p/9149590.html 

创建Java项目,把 activemq-all-5.15.4.jar 包导入到项目。

本次案例主要有两个角色,分别是 新闻发布者(NewsPublisher)、新闻订阅者(NewsSubscriber);发布者相当于 生产者,负责生产消息,订阅者相当于 消费者,负责接收消息。

新闻发布者(NewsPublisher)

package edu.activemq.publisher;

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

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

/**
 * 新闻发布者(生产者)
 * @author Administrator
 *
 */
public class NewsPublisher {

	/**
	 * ActiveMQ连接用户名
	 */
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	
	/**
	 * ActiveMQ连接密码
	 */
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	
	/**
	 * ActiveMQ连接地址
	 */
	private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
	
	/**
	 * 消息队列名称
	 */
	private static final String QUEUE_NAME = "MY_QUEUE";
	
	/**
	 * 发布数量
	 */
	private static final Integer SEND_NUMBER = 5000;
	
	/**
	 * 发布新闻
	 */
	public static void main(String[] args) {
		// 声明连接工厂
		ConnectionFactory connectionFactory;
		
		// 声明连接
		Connection connection = null;
		
		// 声明会话,接收或者发送信息的线程
		Session session;
		
		// 声明消息的目的地
		Destination destination;
		
		// 声明消息生产者
		MessageProducer messageProducer;
		
		try {
			// 实例化连接工厂
			connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);
			
			// 通过连接工厂创建 连接
			connection = connectionFactory.createConnection();
			
			// 启动连接
			connection.start();
			
			// 创建session 参数1:开启事物  参数2:消息确认方式
			session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
			
			// 创建消息队列
			destination = session.createQueue(QUEUE_NAME);
			
			// 创建消息生产者
			messageProducer = session.createProducer(destination);
			
			// 发送消息
			sendMessage(session, messageProducer);
			
			// 提交事务
			session.commit();
		} catch (Exception e) {
			System.out.println("发布新闻失败.");
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (null != connection) {
				try {
					connection.close();
				} catch (Exception e) {
					System.out.println("关闭资源失败.");
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 发送消息
	 * @param session
	 * @param messageProducer
	 */
	private static void sendMessage(Session session, MessageProducer messageProducer) {
		// 声明消息对象
		TextMessage textMessage;
		
		try {
			for (int i = 0; i <= SEND_NUMBER; i++) {
				// 创建消息
				textMessage = session.createTextMessage("当前发送的新闻xxx, 编号为: " + i);
				
				// 发送消息
				messageProducer.send(textMessage);
			}
		} catch (Exception e) {
			System.out.println("发送新闻消息失败.");
			e.printStackTrace();
		}
	}
	
}

新闻订阅者(NewsSubscriber)

package edu.activemq.subscriber;

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;

import edu.activemq.listener.NewsSubscriberListener;

/**
 * 新闻订阅者(消费者)
 * @author Administrator
 *
 */
public class NewsSubscriber {

	/**
	 * ActiveMQ连接用户名
	 */
	private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
	
	/**
	 * ActiveMQ连接密码
	 */
	private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
	
	/**
	 * ActiveMQ连接地址
	 */
	private static final String BROKER_URL = ActiveMQConnection.DEFAULT_BROKER_URL;
	
	/**
	 * 消息队列名称
	 */
	private static final String QUEUE_NAME = "MY_QUEUE";
	
	public static void main(String[] args) {
		// 声明连接工厂
		ConnectionFactory connectionFactory;
		
		// 连接
		Connection connection = null;
		
		// 会话
		Session session;
		
		// 消息目的地
		Destination destination;
		
		// 消息的消费者
		MessageConsumer messageConsumer;
		
		// 实例化连接工厂
		connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKER_URL);
		try {
			// 获取连接
			connection = connectionFactory.createConnection();
			// 启动连接
			connection.start(); 
			
			// 获取Session
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			
			// 创建连接的消息队列
			destination = session.createQueue(QUEUE_NAME);
			 
			// 创建消息的消费者
			messageConsumer = session.createConsumer(destination);
			
			// 注册消息监听
			messageConsumer.setMessageListener(new NewsSubscriberListener());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

新闻监听器(NewsSubscriberListener)

package edu.activemq.listener;

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

/**
 * 新闻监听器
 * @author Administrator
 *
 */
public class NewsSubscriberListener implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			// 创建文本消息对象
			TextMessage textMessage = (TextMessage) message;
			
			// 输出监听到的消息
			System.out.println("NewsSubscriberListener 监听到的消息: " + textMessage.getText());
		} catch (Exception e) {
 			e.printStackTrace();
		}
	}

}

  

新闻发布者(NewsPublisher):负责生产消息,将消息发送到队列里面去。

扫描二维码关注公众号,回复: 1514349 查看本文章

新闻订阅者(NewsSubscriber):负责消费消息,从消息队列里面取出消息。

新闻监听器(NewsSubscriberListener):新闻订阅者的一个监听器,辅助订阅者监听队列的消息。

运行结果:

发布新闻:

订阅者消费:

运行后,队列里的消息已经被订阅者消费了。

猜你喜欢

转载自www.cnblogs.com/hejianliang/p/9151556.html