使用 ActiveMQ 示例


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

在 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. Connection connection = connectionFactory.createConnection();
  4. connection.start();
  5. Session session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
  6. Destination destination = session.createQueue("my-queue");
  7. MessageProducer producer = session.createProducer(destination);
  8. ; i<3; i++) {
  9. MapMessage message = session.createMapMessage();
  10. message.setLong("count", new Date().getTime());
  11. );
  12. //通过消息生产者发出消息
  13. producer.send(message);
  14. }
  15. session.commit();
  16. session.close();
  17. connection.close();
  18. }

Jms 接收代码:

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

启动 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. <!-- 在非 web / ejb 容器中使用 pool 时,要手动 stop,spring 不会为你执行 destroy-method 的方法
  5. <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
  6. <property name="connectionFactory">
  7. <bean class="org.apache.activemq.ActiveMQConnectionFactory">
  8. <property name="brokerURL" value="tcp://localhost:61616" />
  9. </bean>
  10. </property>
  11. </bean>
  12. -->
  13. <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  14. <property name="brokerURL" value="tcp://localhost:61616" />
  15. </bean>
  16. <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  17. <property name="connectionFactory" ref="jmsFactory" />
  18. <property name="defaultDestination" ref="destination" />
  19. <property name="messageConverter">
  20. <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
  21. </property>
  22. </bean>
  23. <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
  24. <constructor-arg index="0" value="my-queue" />
  25. </bean>
  26. </beans>

sender:

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

receiver:

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

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

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

使用 ActiveMQ 示例的更多相关文章

  1. Java ActiveMQ 示例

    所需引入Jar包: jms-1.1.jar activemq-all-5.15.0.jar 生产者 package com.mousewheel.demo; import javax.jms.Conn ...

  2. 分布式-信息方式-ActiveMQ示例

    实战 代码如下: 信息生产者 package test.mq.helloword; import javax.jms.Connection; import javax.jms.ConnectionFa ...

  3. C#---初学ActiveMQ中间件

    本篇文章只适合跟我一样的初学者,因为现阶段的我们只想者怎么实现功能,不太会去考虑潜在异常.从上周开始优化公司的调控系统,原先采取的都是通过操作数据库去实现功能,客户体验效果不佳,经过领导决定是用中间件 ...

  4. 消息队列之 ActiveMQ(山东数漫江湖)

    简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...

  5. 消息队列之 ActiveMQ

    简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...

  6. 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38

    1. ActiveMQ 1). ActiveMQ ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message ...

  7. Active MQ C#实现

    原文链接: Active MQ C#实现 内容概要 主要以源码的形式介绍如何用C#实现同Active MQ 的通讯.本文假设你已经正确安装JDK1.6.x,了解Active MQ并有一定的编程基础. ...

  8. ActiveMQ笔记(1):编译、安装、示例代码

    一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...

  9. ActiveMQ入门示例

    1.ActiveMQ下载地址 http://activemq.apache.org/download.html 2.ActiveMQ安装,下载解压之后如下目录

随机推荐

  1. oracle sql语句学习(一)

    oraclexe 11.0.2.0 输出到文件 SQL>spool /*完整路径*/; SQL>spool off; 多表自然链接 select spj.sno from spj join ...

  2. Linux-进程状态和system函数

    1.进程的5种状态 (1).就绪态. 这个进程当前所有运行条件就绪,只要得到CPU时间就能直接运行. (2).运行态 就绪态时得到了CPU就进入运行态开始运行. (3).僵尸态 进程已经结束但是父进程 ...

  3. js 经纬度计算直线距离

    function getRad(d) { var PI = Math.PI; return d * PI / 180.0; } function getDistance(lat1, lng1, lat ...

  4. Python笔记_第三篇_面向对象_2.构造函数和析构函数(含self说明)

    1. 构造函数: 为什么要有构造函数? 打一个比方:类的创建就是好比你创建了好了一种格式的房间,你租给上一个住户的后,里面会对方很多“垃圾”和不规则的物品摆放.构造函数就是下一个住户再使用的时候进行物 ...

  5. QMessageBox按钮自定义文字

    msgbox = QMessageBox()msgbox.setStandardButtons(QMessageBox.Yes|QMessageBox.No)msgbox.button(QMessag ...

  6. 四、NOSQL之Redis持久化缓存服务基础实战第三部

    1.NOSQL的理解 NOSQL是不仅仅是SQL,说的就是sql的补充,但是不能替代SQL. nosql库:memcached.memcachedb.redis 2.redis 简介 Redis是一个 ...

  7. 19)PHP,数组知识

    (1)数组的基础 在PHP中,数组的下标可以是数字,也可以是字符串 在PHP中,数组元素的顺序不是由下标决定的,而是由其加入的的顺序决定 (2)数组定义: array(1,5,11,'abs',tru ...

  8. 第一章:ESXi6.7虚拟化环境安装

    1.1 硬件环境及镜像引导准备 1.1.1       硬件和系统资源 要安装ESXi6.7,硬件和系统资源必须满足下列要求: ESXi 6.7 要求主机至少具有两个 CPU 内核,生产环境中需要根据 ...

  9. linux中常见压缩文件格式

    文件后缀名 说明 *.zip zip 程序打包压缩的文件 *.rar rar 程序压缩的文件 *.7z 7zip 程序压缩的文件 *.tar tar 程序打包,未压缩的文件 *.gz gzip 程序( ...

  10. tensorflow(五)

    一.单机编程框架 单机程序是指启动和运行都在一台机器的一个进程中完成,因为没有网络开销,非常适合参数不多.计算量小的模型. 步骤,创建单机数据流图,创建并运行单机会话. saver = tf.trai ...