activeMQ

转载 2011年01月11日 15:59:00

原文出处: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. }  

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. }  

启动 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. }  

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. }  

注意:直接用 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 相关资料

ActiveMQ源码解析(四):聊聊消息的可靠传输机制和事务控制

在消息传递的过程中,某些情况下比如网络闪断、丢包等会导致消息永久性丢失,这时消费者是接收不到消息的,这样就会造成数据不一致的问题。那么我们怎么才能保证消息一定能发送给消费者呢?怎么才能避免数据不一致呢...
  • flashflight
  • flashflight
  • 2016年06月27日 03:27
  • 5860

ActiveMQ系列之——安装、运行及事例代码(一)

简要介绍Linux安装ActiveMQ、运行,编写并运行简单接发消息的程序,以后续的消息持久化、集群、与Spring集成做准备。...
  • wangdongsong1229
  • wangdongsong1229
  • 2014年02月10日 10:07
  • 3948

即时通讯-测试ActiveMQ服务器

基本流程按照JMS的规范,我们首先需要获得一个JMS connection factory.,通过这个connection factory来创建connection.在这个基础之上我们再创建sessi...
  • u012987546
  • u012987546
  • 2016年10月29日 14:06
  • 1110

activemq的web管理界面

activemq的web管理界面,http://127.0.0.1:8161/admin
  • ty110119120
  • ty110119120
  • 2011年07月11日 11:14
  • 22953

ActiveMQ有支持两种事务

ActiveMQ有支持两种事务, JMS transactions - the commit() / rollback() methods on a Session (which is like...
  • hxpjava1
  • hxpjava1
  • 2015年04月14日 16:27
  • 12050

ActiveMQ安全机制(五)

ActiveMQ支持可插拔的安全机制,用以在不同的provider之间切换。 1.JAAS认证插件 JAAS(Java Authentication and Authorizati...
  • u014401141
  • u014401141
  • 2017年01月25日 11:21
  • 674

ActiveMQ简单封装

听说消息中间件挺重要的,今天简单看了下activeMQ,感觉挺有意思,简单封装了一下,做个笔记。1、先要下载activeMQ,下载地址:http://activemq.apache.org/activ...
  • happy_Pinocchio
  • happy_Pinocchio
  • 2017年01月14日 23:22
  • 1126

ActiveMQ的消息过滤器

1、消息过滤器的简介       消息选择器的用法       MessageConsumer是一个Session创建的对象,用来从Destination接收消息       关于消息选择器...
  • zbw18297786698
  • zbw18297786698
  • 2016年11月01日 20:04
  • 1709

activeMQ实例在项目中的运用【项目实战系列】

1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.14.0-bin.zip,然后双击...
  • LOVELONG8808
  • LOVELONG8808
  • 2016年08月17日 22:24
  • 14519

activemq 信息优先级

我们可以在发送消息时,指定消息的权重,broker可以建议权重较高的消息将会优先发送给Consumer。在某些场景下,我们通常希望权重较高的消息优先传送;不过因为各种原因,priority并不能决定消...
  • Truong
  • Truong
  • 2017年07月01日 19:59
  • 1308
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:activeMQ
举报原因:
原因补充:

(最多只允许输入30个字)