activeMQ

原文出处:http://blog.chenlb.com/2010/01/activemq-hello.html

企业中各项目中相互协作的时候可能用得到消息通知机制。比如有东西更新了,可以通知做索引。

在 Java 里有 JMS 的多个实现。其中 apache 下的 ActiveMQ 就是不错的选择。还有一个比较热的是 RabbitMQ (是 erlang 语言实现的)。这里示例下使用 ActiveMQ

用 ActiveMQ 最好还是了解下 JMS

JMS 公共 点对点域 发布/订阅域
ConnectionFactory QueueConnectionFactory TopicConnectionFactory
Connection QueueConnection TopicConnection
Destination Queue Topic
Session QueueSession TopicSession
MessageProducer QueueSender TopicPublisher
MessageConsumer QueueReceiver TopicSubscriber

JMS 定义了两种方式:Quere(点对点);Topic(发布/订阅)。

ConnectionFactory 是连接工厂,负责创建Connection。

Connection 负责创建 Session。

Session 创建 MessageProducer(用来发消息) 和 MessageConsumer(用来接收消息)。

Destination 是消息的目的地。

详细的可以网上找些 JMS 规范(有中文版)。

下载 apache-activemq-5.3.0。http://activemq.apache.org/download.html,解压,然后双击 bin/activemq.bat。运行后,可以在 http://localhost:8161/admin 观察。也有 demo, http://localhost:8161/demo。把 activemq-all-5.3.0.jar 加入 classpath。

Jms 发送 代码:

  1. public static void main(String[] args) throws Exception {   
  2.     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();   
  3.   
  4.     Connection connection = connectionFactory.createConnection();   
  5.     connection.start();   
  6.   
  7.     Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);   
  8.     Destination destination = session.createQueue("my-queue");   
  9.   
  10.     MessageProducer producer = session.createProducer(destination);   
  11.     for(int i=0; i<3; i++) {   
  12.         MapMessage message = session.createMapMessage();   
  13.         message.setLong("count"new Date().getTime());   
  14.         Thread.sleep(1000);   
  15.         //通过消息生产者发出消息   
  16.         producer.send(message);   
  17.     }   
  18.     session.commit();   
  19.     session.close();   
  20.     connection.close();   
  21. }  
public static void main(String[] args) throws Exception {
	ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

	Connection connection = connectionFactory.createConnection();
	connection.start();

	Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
	Destination destination = session.createQueue("my-queue");

	MessageProducer producer = session.createProducer(destination);
	for(int i=0; i<3; i++) {
		MapMessage message = session.createMapMessage();
		message.setLong("count", new Date().getTime());
		Thread.sleep(1000);
		//通过消息生产者发出消息
		producer.send(message);
	}
	session.commit();
	session.close();
	connection.close();
}

Jms 接收代码:

  1. public static void main(String[] args) throws Exception {   
  2.     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();   
  3.   
  4.     Connection connection = connectionFactory.createConnection();   
  5.     connection.start();   
  6.   
  7.     final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);   
  8.     Destination destination = session.createQueue("my-queue");   
  9.   
  10.     MessageConsumer consumer = session.createConsumer(destination);   
  11.     /*//listener 方式  
  12.     consumer.setMessageListener(new MessageListener() {  
  13.         public void onMessage(Message msg) {  
  14.             MapMessage message = (MapMessage) msg;  
  15.             //TODO something....  
  16.             System.out.println("收到消息:" + new Date(message.getLong("count")));  
  17.             session.commit();  
  18.         }  
  19.     });  
  20.     Thread.sleep(30000);  
  21.     */  
  22.     int i=0;   
  23.     while(i<3) {   
  24.         i++;   
  25.         MapMessage message = (MapMessage) consumer.receive();   
  26.         session.commit();   
  27.   
  28.         //TODO something....   
  29.         System.out.println("收到消息:" + new Date(message.getLong("count")));   
  30.     }   
  31.   
  32.     session.close();   
  33.     connection.close();   
  34. }  
public static void main(String[] args) throws Exception {
	ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();

	Connection connection = connectionFactory.createConnection();
	connection.start();

	final Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
	Destination destination = session.createQueue("my-queue");

	MessageConsumer consumer = session.createConsumer(destination);
	/*//listener 方式
	consumer.setMessageListener(new MessageListener() {

		public void onMessage(Message msg) {
			MapMessage message = (MapMessage) msg;
			//TODO something....
			System.out.println("收到消息:" + new Date(message.getLong("count")));
			session.commit();
		}

	});
	Thread.sleep(30000);
	*/
	int i=0;
	while(i<3) {
		i++;
		MapMessage message = (MapMessage) consumer.receive();
		session.commit();

		//TODO something....
		System.out.println("收到消息:" + new Date(message.getLong("count")));
	}

	session.close();
	connection.close();
}

启动 JmsReceiver 和 JmsSender 可以在看输出三条时间信息。当然 Jms 还指定有其它格式的数据,如 TextMessage

结合 Spring 的 JmsTemplate 方便用:

xml:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
  4.   
  5. <!-- 在非 web / ejb 容器中使用 pool 时,要手动 stop,spring 不会为你执行 destroy-method 的方法   
  6.     <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  
  7.         <property name="connectionFactory">  
  8.             <bean class="org.apache.activemq.ActiveMQConnectionFactory">  
  9.                 <property name="brokerURL" value="tcp://localhost:61616" />  
  10.             </bean>  
  11.         </property>  
  12.     </bean>  
  13. -->  
  14.     <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">  
  15.         <property name="brokerURL" value="tcp://localhost:61616" />  
  16.     </bean>  
  17.     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  18.         <property name="connectionFactory" ref="jmsFactory" />  
  19.         <property name="defaultDestination" ref="destination" />  
  20.         <property name="messageConverter">  
  21.             <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />  
  22.         </property>  
  23.     </bean>  
  24.   
  25.     <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">  
  26.         <constructor-arg index="0" value="my-queue" />  
  27.     </bean>  
  28.   
  29. </beans>  

sender:

  1. public static void main(String[] args) {   
  2.     ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");   
  3.   
  4.     JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");   
  5.   
  6.     jmsTemplate.send(new MessageCreator() {   
  7.   
  8.         public Message createMessage(Session session) throws JMSException {   
  9.             MapMessage mm = session.createMapMessage();   
  10.             mm.setLong("count"new Date().getTime());   
  11.             return mm;   
  12.         }   
  13.   
  14.     });   
  15. }  
public static void main(String[] args) {
	ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

	JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");

	jmsTemplate.send(new MessageCreator() {

		public Message createMessage(Session session) throws JMSException {
			MapMessage mm = session.createMapMessage();
			mm.setLong("count", new Date().getTime());
			return mm;
		}

	});
}

receiver:

  1. public static void main(String[] args) {   
  2.     ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");   
  3.   
  4.     JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");   
  5.     while(true) {   
  6.         Map<String, Object> mm =  (Map<String, Object>) jmsTemplate.receiveAndConvert();   
  7.         System.out.println("收到消息:" + new Date((Long)mm.get("count")));   
  8.     }   
  9. }  
public static void main(String[] args) {
	ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:app*.xml");

	JmsTemplate jmsTemplate = (JmsTemplate) ctx.getBean("jmsTemplate");
	while(true) {
		Map<String, Object> mm =  (Map<String, Object>) jmsTemplate.receiveAndConvert();
		System.out.println("收到消息:" + new Date((Long)mm.get("count")));
	}
}

注意:直接用 Jms 接口时接收了消息后要提交一下,否则下次启动接收者时还可以收到旧数据。有了 JmsTemplate 就不用自己提交 session.commit() 了。如果使用了 PooledConnectionFactory 要把 apache-activemq-5.3.0/lib/optional/activemq-pool-5.3.0.jar 加到 classpath

参考资料:

Hello ActiveMQ

Spring2.5整合ActiveMQ 5.2

spring-support

JMS 相关资料

阅读更多
个人分类: java
上一篇uBuntu 安装的艰辛历程
下一篇MySQL:MySQL日期数据范例、MySQL时候范例利用总结
想对作者说点什么? 我来说一句

activeMq的一个小例子

2018年01月09日 72KB 下载

activemq分布式集群视频教程

2018年02月05日 49B 下载

ActionMQ+JMS文档

2011年08月01日 848KB 下载

activeMQ学习

2010年01月07日 2KB 下载

activemq开发文档

2018年06月29日 50KB 下载

activemq书籍及工具

2017年09月28日 68B 下载

ActiveMQ安装文档

2017年10月30日 23KB 下载

ActiveMQ(中文)参考手册

2018年04月09日 201KB 下载

activemq activeMq笔记

2016年01月04日 208KB 下载

没有更多推荐了,返回首页

关闭
关闭