ActiveMQ消息队列的使用

1、ActiveMQ简介

ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个彻底支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已是好久的事情了,可是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。java

主要特色:spring

1. 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP服务器

2. 彻底支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)session

3. 对Spring的支持,ActiveMQ能够很容易内嵌到使用Spring的系统里面去,并且也支持Spring2.0的特性tcp

4. 经过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中经过JCA 1.5 resource adaptors的配置,可让ActiveMQ能够自动的部署到任何兼容J2EE 1.4 商业服务器上ide

5. 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA性能

6. 支持经过JDBC和journal提供高速的消息持久化测试

7. 从设计上保证了高性能的集群,客户端-服务器,点对点spa

8. 支持Ajax设计

9. 支持与Axis的整合

10. 能够很容易得调用内嵌JMS provider,进行测试

2、ActiveMQ的消息形式

对于消息的传递有两种类型:

一种是点对点的(Queue),即一个生产者和一个消费者一一对应;

另外一种是发布/订阅模式(Topic),即一个生产者产生消息并进行发送后,能够由多个消费者进行接收。

JMS定义了五种不一样的消息正文格式,以及调用的消息类型,容许你发送并接收以一些不一样形式的数据,提供现有消息格式的一些级别的兼容性。

  • StreamMessage -- Java原始值的数据流
  • MapMessage--一套名称-值对
  • TextMessage--一个字符串对象
  • ObjectMessage--一个序列化的 Java对象
  • BytesMessage--一个字节的数据流

3、ActiveMQ的安装

第一步: 把ActiveMQ 的压缩包上传到Linux系统。

第二步:解压缩。

第三步:启动。

使用bin目录下的activemq命令启动:

[root@localhost bin]# ./activemq start

关闭:

[root@localhost bin]# ./activemq stop

查看状态:

[root@localhost bin]# ./activemq status 

注意:若是ActiveMQ整合spring使用不要使用activemq-all-5.12.0.jar包。建议使用5.11.2

进入管理后台:

http://192.168.25.168:8161/admin

用户名:admin

密码:admin

4、ActiveMQ的两种使用方法

一、点对点方式(若是没有人处理,就会持久化储存知道有人来处理)

public class ActiveMqTest {

	/**
	 * 点到点形式发送消息
	 */
	@Test
	public void testQueueProducer() throws Exception {
		//一、建立一个链接工厂对象,须要指定服务的ip及端口。
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616");
		//二、使用工厂对象建立一个Connection对象。
		Connection connection = connectionFactory.createConnection();
		//三、开启链接,调用Connection对象的start方法。
		connection.start();
		//四、建立一个Session对象。
		//第一个参数:是否开启事务。若是true开启事务,第二个参数无心义。通常不开启事务false。
		//第二个参数:应答模式。自动应答或者手动应答。通常自动应答。
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//五、使用Session对象建立一个Destination对象。两种形式queue、topic,如今应该使用queue
		Queue queue = session.createQueue("test-queue");
		//六、使用Session对象建立一个Producer对象。
		MessageProducer producer = session.createProducer(queue);
		//七、建立一个Message对象,能够使用TextMessage。
		/*TextMessage textMessage = new ActiveMQTextMessage();
		textMessage.setText("hello Activemq");*/
		TextMessage textMessage = session.createTextMessage("hello activemq");
		//八、发送消息
		producer.send(textMessage);
		//九、关闭资源
		producer.close();
		session.close();
		connection.close();
	}
	
	@Test
	public void testQueueConsumer() throws Exception {
		//建立一个ConnectionFactory对象链接MQ服务器
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616");
		//建立一个链接对象
		Connection connection = connectionFactory.createConnection();
		//开启链接
		connection.start();
		//使用Connection对象建立一个Session对象
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//建立一个Destination对象。queue对象
		Queue queue = session.createQueue("test-queue");
		//使用Session对象建立一个消费者对象。
		MessageConsumer consumer = session.createConsumer(queue);
		//接收消息
		consumer.setMessageListener(new MessageListener() {
			
			@Override
			public void onMessage(Message message) {
				//打印结果
				TextMessage textMessage = (TextMessage) message;
				String text;
				try {
					text = textMessage.getText();
					System.out.println(text);
				} catch (JMSException e) {
					e.printStackTrace();
				}
				
			}
		});
		//等待接收消息
		System.in.read();
		//关闭资源
		consumer.close();
		session.close();
		connection.close();
	}
}

二、广播方式(只会广播在线的,过期不候)

public class ActiveMqTest {
	@Test
	public void testTopicProducer() throws Exception {
		//一、建立一个链接工厂对象,须要指定服务的ip及端口。
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616");
		//二、使用工厂对象建立一个Connection对象。
		Connection connection = connectionFactory.createConnection();
		//三、开启链接,调用Connection对象的start方法。
		connection.start();
		//四、建立一个Session对象。
		//第一个参数:是否开启事务。若是true开启事务,第二个参数无心义。通常不开启事务false。
		//第二个参数:应答模式。自动应答或者手动应答。通常自动应答。
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//五、使用Session对象建立一个Destination对象。两种形式queue、topic,如今应该使用topic
		Topic topic = session.createTopic("test-topic");
		//六、使用Session对象建立一个Producer对象。
		MessageProducer producer = session.createProducer(topic);
		//七、建立一个Message对象,能够使用TextMessage。
		/*TextMessage textMessage = new ActiveMQTextMessage();
		textMessage.setText("hello Activemq");*/
		TextMessage textMessage = session.createTextMessage("topic message");
		//八、发送消息
		producer.send(textMessage);
		//九、关闭资源
		producer.close();
		session.close();
		connection.close();
	}
	
	@Test
	public void testTopicConsumer() throws Exception {
		//建立一个ConnectionFactory对象链接MQ服务器
		ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.25.161:61616");
		//建立一个链接对象
		Connection connection = connectionFactory.createConnection();
		//开启链接
		connection.start();
		//使用Connection对象建立一个Session对象
		Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
		//建立一个Destination对象。topic对象
		Topic topic = session.createTopic("test-topic");
		//使用Session对象建立一个消费者对象。
		MessageConsumer consumer = session.createConsumer(topic);
		//接收消息
		consumer.setMessageListener(new MessageListener() {
			
			@Override
			public void onMessage(Message message) {
				//打印结果
				TextMessage textMessage = (TextMessage) message;
				String text;
				try {
					text = textMessage.getText();
					System.out.println(text);
				} catch (JMSException e) {
					e.printStackTrace();
				}
				
			}
		});
		System.out.println("topic消费者3启动。。。。");
		//等待接收消息
		System.in.read();
		//关闭资源
		consumer.close();
		session.close();
		connection.close();
	}
}