ActiveMQ消息队列服务(二)发送和接收

创建java项目,导入jar包

  • ActiveMQ的解压包中,提供了运行ActiveMQ的所有jar。

创建消息生成者,发送消息

说明:ActiveMQ是实现了JMS规范的。在实现消息服务的时候,必须基于API接口规范。下述API都是接口类型,定义在javax.jms包中,是JMS标准接口定义。ActiveMQ完全实现这一套api标准。

##JMS常用的API说明##
ConnectionFactory
链接工厂, 用于创建链接的工厂类型。
Connection
链接,用于建立访问ActiveMQ连接的类型, 由链接工厂创建。
Session
会话, 一次持久有效、有状态的访问,由链接创建。
Destination  &  Queue & Topic
目的地, 即本次访问ActiveMQ消息队列的地址,由Session会话创建。
(1)interface Queue extends Destination
(2)Queue:队列模型,只有一个消费者。消息一旦被消费,默认删除。
(3)Topic:主题订阅中的消息,会发送给所有的消费者同时处理。
Message
消息,在消息传递过程中数据载体对象,是所有消息【文本消息TextMessage,对象消息ObjectMessage等】具体类型的顶级接口,可以通过会话创建或通过会话从ActiveMQ服务中获取。
MessageProducer
消息生成者, 在一次有效会话中, 用于发送消息给ActiveMQ服务的工具,由Session会话创建。
MessageCustomer
消息消费者【消息订阅者,消息处理者】, 在一次有效会话中, 用于ActiveMQ服务中获取消息的工具,由Session会话创建。
我们定义的消息生产者和消费者,都是基于上面API实现的。

第一步:创建MyProducer类,定义sendMessage方法

package cn.activemq.mq.producer;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;

public class MyProducer {

	// 定义链接工厂
	ConnectionFactory connectionFactory = null;
	// 定义链接
	Connection connection = null;
	// 定义会话
	Session session = null;
	// 定义目的地
	Destination destination = null;
	// 定义消息生成者
	MessageProducer producer = null;
	// 定义消息
	Message message = null;
	
	public void sendToMQ(){
		
		try{
			
			/*
			 * 创建链接工厂
			 * ActiveMQConnectionFactory - 由ActiveMQ实现的ConnectionFactory接口实现类.
			 * 构造方法: public ActiveMQConnectionFactory(String userName, String password, String brokerURL)
			 *  userName - 访问ActiveMQ服务的用户名, 用户名可以通过jetty-realm.properties配置文件配置.
			 *  password - 访问ActiveMQ服务的密码, 密码可以通过jetty-realm.properties配置文件配置.
			 *  brokerURL - 访问ActiveMQ服务的路径地址. 路径结构为 - 协议名://主机地址:端口号
			 *      此链接基于TCP/IP协议.
			 */
			connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.18.33:61616");
			
			// 创建链接对象
			connection = connectionFactory.createConnection();
			// 启动链接
			connection.start();
			
			/*
			 * 创建会话对象
			 * 方法 - connection.createSession(boolean transacted, int acknowledgeMode);
			 *  transacted - 是否使用事务, 可选值为true|false
			 *      true - 使用事务, 当设置此变量值, 则acknowledgeMode参数无效, 建议传递的acknowledgeMode参数值为
			 *          Session.SESSION_TRANSACTED
			 *      false - 不使用事务, 设置此变量值, 则acknowledgeMode参数必须设置.
			 *  acknowledgeMode - 消息确认机制, 可选值为:
			 *      Session.AUTO_ACKNOWLEDGE - 自动确认消息机制
			 *      Session.CLIENT_ACKNOWLEDGE - 客户端确认消息机制
			 *      Session.DUPS_OK_ACKNOWLEDGE - 有副本的客户端确认消息机制
			 */
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			
			// 创建目的地, 目的地命名即队列命名, 消息消费者需要通过此命名访问对应的队列
			destination = session.createQueue("test-mq");
			
			// 创建消息生成者, 创建的消息生成者与某目的地对应, 即方法参数目的地.
			producer = session.createProducer(destination);
			
			// 创建消息对象, 创建一个文本消息, 此消息对象中保存要传递的文本数据.
			message = session.createTextMessage("hello,activeme");
			
			// 发送消息
			producer.send(message);
			System.out.println("消息发送成功!");
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("访问ActiveMQ服务发生错误!!");
		}finally{
			try {
				// 回收消息发送者资源
				if(null != producer)
					producer.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
			try {
				// 回收会话资源
				if(null != session)
					session.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
			try {
				// 回收链接资源
				if(null != connection)
					connection.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}
	}
}

第二步:创建一个测试类MessageTest

package cn.activemq.mq.test;
import org.junit.Test;
import cn.activemq.mq.producer.MyProducer;
public class MessageTest {

	@Test
	public void sendToMQ(){
		MyProducer producer = new MyProducer();
		producer.sendToMQ();
	}
}

第三步:测试

  1. 设置防火墙,配置61616端口。注意修改之后重启防火墙。
  2. 测试结果:

  1. 查看ActiveMQ管理控制界面,消息发送成功

创建消息消费者,消费消息

第一步:创建MyConsumer类

package cn.activemq.mq.consumer;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class MyConsumer {
	
	// 定义链接工厂
	ConnectionFactory connectionFactory = null;
	// 定义链接
	Connection connection = null;
	// 定义会话
	Session session = null;
	// 定义目的地
	Destination destination = null;
	// 定义消息消费者
	MessageConsumer consumer = null;
	// 定义消息
	Message message = null;
	
	public void recieveFromMQ(){
		
		try{
			
			/*
			 * 创建链接工厂
			 * ActiveMQConnectionFactory - 由ActiveMQ实现的ConnectionFactory接口实现类.
			 * 构造方法: public ActiveMQConnectionFactory(String userName, String password, String brokerURL)
			 *  userName - 访问ActiveMQ服务的用户名, 用户名可以通过jetty-realm.properties配置文件配置.
			 *  password - 访问ActiveMQ服务的密码, 密码可以通过jetty-realm.properties配置文件配置.
			 *  brokerURL - 访问ActiveMQ服务的路径地址. 路径结构为 - 协议名://主机地址:端口号
			 *      此链接基于TCP/IP协议.
			 */
			connectionFactory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.18.33:61616");
			
			// 创建链接对象
			connection = connectionFactory.createConnection();
			// 启动链接
			connection.start();
			
			/*
			 * 创建会话对象
			 * 方法 - connection.createSession(boolean transacted, int acknowledgeMode);
			 *  transacted - 是否使用事务, 可选值为true|false
			 *      true - 使用事务, 当设置此变量值, 则acknowledgeMode参数无效, 建议传递的acknowledgeMode参数值为
			 *          Session.SESSION_TRANSACTED
			 *      false - 不使用事务, 设置此变量值, 则acknowledgeMode参数必须设置.
			 *  acknowledgeMode - 消息确认机制, 可选值为:
			 *      Session.AUTO_ACKNOWLEDGE - 自动确认消息机制
			 *      Session.CLIENT_ACKNOWLEDGE - 客户端确认消息机制
			 *      Session.DUPS_OK_ACKNOWLEDGE - 有副本的客户端确认消息机制
			 */
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			
			// 创建目的地, 目的地命名即队列命名, 消息消费者需要通过此命名访问对应的队列
			destination = session.createQueue("test-mq");
			
			// 创建消息消费者, 创建的消息消费者与某目的地对应, 即方法参数目的地.
			consumer = session.createConsumer(destination);
			
			// 从ActiveMQ服务中获取消息
			message = consumer.receive();
			
			TextMessage tMsg = (TextMessage) message;
			
			System.out.println("从MQ中获取的消息是:"+tMsg.getText());
			
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("访问ActiveMQ服务发生错误!!");
			
		}finally{
			try {
				// 回收消息消费者资源
				if(null != consumer)
					consumer.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
			try {
				// 回收会话资源
				if(null != session)
					session.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
			try {
				// 回收链接资源
				if(null != connection)
					connection.close();
			} catch (JMSException e) {
				e.printStackTrace();
			}
		}		
	}
}

第二步:修改测试类MessageTest,新增测试方法

@Test
	public void recieveFromMQ(){
		MyConsumer consumer = new MyConsumer();
		consumer.recieveFromMQ();
	}

第三步:测试

  1. 查看Eclipse控制台

  1. 查看ActiveMQ管理控制界面,消息消费成功

转载于:https://my.oschina.net/u/4118481/blog/3045795

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值