[ActiveMQ实战]基于JMS的点对点消息传播

      ActiveMQ是基于JMS实现的,JMS是J2EE规范中的一个。它有两种消息传播方式:点对点和发布/订阅模式。其中EJB的MDB(消息驱动bean)也是基于JMS实现的。ActiveMQ是一个开源的消息服务总线。下面通过一个实例逐步认识它。这里主要讲解点对点的方式。

一、启动avtivemq服务

1.首先下载avtivemq的压缩包

2.解压(E:\apache-activemq-5.12.0)

3.启动,在bin目录下,有32位和64位系统不同的文件夹,可自行选择进入不同的文件夹,执行activemq.bat脚本

启动成功如下:

成功后,ActiveMQ 服务启动地址:http://127.0.0.1:8161/admin/用户名/密码admin/admin,如下:


   在第一行标题中看到queues,里面显示点对点消息的传播信息。

二、点对点模型(P2P)

    在点对点模型中,相当于两个人打电话,两个人独享一条通信线路。一方发送消息,一方接收消息。

   

    在p2p的模型中,双方通过队列交流,一个队列只有一个生产者和一个消费者。

三、生产者

1.新建一个java项目,引入上面解压的压缩包中的activemq-all-5.12.0.jar即可。

2.执行入口

package com.tgb.activemq;

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 xx
 *
 */
public class JMSProducer {
	//默认连接用户名
	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 SENNUM = 10;
	
	public static void main(String[] args){
		ConnectionFactory factory ; //连接工厂
		Connection connection = null ; //连接
		Session session ; //会话,接收或者发送消息的线程
		Destination destination; //消息的目的地
		MessageProducer messageProducer; //消息生产者
		//实例化连接工厂
		factory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD, JMSProducer.BROKEURL);
		//通过连接工厂获取connection
		try {
			connection = factory.createConnection();
			connection.start(); //启动连接
			//创建session
			session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
			//创建消息队列
			destination = session.createQueue("FirstQueue");
			//创建消息生产者
			messageProducer = session.createProducer(destination);
			//发送消息
			sendMessage(session, messageProducer);
			session.commit();
		} catch (JMSException e) {
			e.printStackTrace();
		}finally{
			if (connection != null) {
				try {
					connection.close();
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * 发送消息
	 * @param session
	 * @param mp
	 * @throws JMSException 
	 */
	public static void sendMessage(Session session, MessageProducer mp) throws JMSException{
		for(int i = 0;i<JMSProducer.SENNUM;i++){
			TextMessage message = session.createTextMessage("ActiveMq 发送的消息" + i);
			System.out.println("发送消息:" + "ActiveMq 发送的消息" + i);
			mp.send(message);
		}
	}
}

四、消费者

package com.tgb.activemq;

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

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

/**
 * 消息的消费者
 * @author xx
 */
public class JMSConsumer2 {

	//默认连接用户名
	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;
	
	public static void main(String[] args) {
		ConnectionFactory factory ; //连接工厂
		Connection connection = null ; //连接
		Session session ; //会话,接收或者发送消息的线程
		Destination destination; //消息的目的地
		MessageConsumer messageConsumer; //消息消费者
		//实例化连接工厂
		factory = new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD, JMSConsumer2.BROKEURL);
		//通过连接工厂获取connection
		try {
			connection = factory.createConnection();
			connection.start(); //启动连接
			//创建session
			session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
			//创建连接消息队列,消息到达的目的地
			destination = session.createQueue("FirstQueue");
			//创建消费者
			messageConsumer = session.createConsumer(destination);
			//注册消息监听
			messageConsumer.setMessageListener(new Listener());
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

五、消息监听类

package com.tgb.activemq;

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

/**
 * 消息监听类
 * @author xx
 */
public class Listener implements MessageListener {

	@Override
	public void onMessage(Message message) {
		try {
			System.out.println("收到的消息:" + ((TextMessage)message).getText());
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

六、执行

1.首先执行生产者,消费者监听生产者,可以在activemq的服务页面中看到如下效果

  

   生产者生产了10条消息放到队列中,消费者为0

2.执行消费者

 

消费者一个,(Messages Dequeued)出队列的消息10条,(number of pending message)等待消费的消息数0。

七、总结

    点对点消息的传播,生产者向特定的消息队列传播消息,一个消费者从该队列读取消息。生产者不需要在接收者接收消息时处于运行,消费者也不需要生产者在发送消息时处于运行状态,队列相当于一个中间的仓库,生产者发送消息,立即返回状态发送成功。等消费者上线时 ,才接受消息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值