使用 ActiveMQ 示例
使用 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 发送 代码:
- 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);
- ; i<3; i++) {
- MapMessage message = session.createMapMessage();
- message.setLong("count", new Date().getTime());
- );
- //通过消息生产者发出消息
- producer.send(message);
- }
- session.commit();
- session.close();
- connection.close();
- }
Jms 接收代码:
- 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);
- */
- ;
- ) {
- 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:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
- <!-- 在非 web / ejb 容器中使用 pool 时,要手动 stop,spring 不会为你执行 destroy-method 的方法
- <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
- <property name="connectionFactory">
- <bean class="org.apache.activemq.ActiveMQConnectionFactory">
- <property name="brokerURL" value="tcp://localhost:61616" />
- </bean>
- </property>
- </bean>
- -->
- <bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
- <property name="brokerURL" value="tcp://localhost:61616" />
- </bean>
- <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
- <property name="connectionFactory" ref="jmsFactory" />
- <property name="defaultDestination" ref="destination" />
- <property name="messageConverter">
- <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
- </property>
- </bean>
- <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg index="0" value="my-queue" />
- </bean>
- </beans>
sender:
- 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:
- 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
参考资料:
使用 ActiveMQ 示例的更多相关文章
- Java ActiveMQ 示例
所需引入Jar包: jms-1.1.jar activemq-all-5.15.0.jar 生产者 package com.mousewheel.demo; import javax.jms.Conn ...
- 分布式-信息方式-ActiveMQ示例
实战 代码如下: 信息生产者 package test.mq.helloword; import javax.jms.Connection; import javax.jms.ConnectionFa ...
- C#---初学ActiveMQ中间件
本篇文章只适合跟我一样的初学者,因为现阶段的我们只想者怎么实现功能,不太会去考虑潜在异常.从上周开始优化公司的调控系统,原先采取的都是通过操作数据库去实现功能,客户体验效果不佳,经过领导决定是用中间件 ...
- 消息队列之 ActiveMQ(山东数漫江湖)
简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...
- 消息队列之 ActiveMQ
简介 ActiveMQ 特点 ActiveMQ 是由 Apache 出品的一款开源消息中间件,旨在为应用程序提供高效.可扩展.稳定.安全的企业级消息通信. 它的设计目标是提供标准的.面向消息的.多语言 ...
- 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
1. ActiveMQ 1). ActiveMQ ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message ...
- Active MQ C#实现
原文链接: Active MQ C#实现 内容概要 主要以源码的形式介绍如何用C#实现同Active MQ 的通讯.本文假设你已经正确安装JDK1.6.x,了解Active MQ并有一定的编程基础. ...
- ActiveMQ笔记(1):编译、安装、示例代码
一.编译 虽然ActiveMQ提供了发布版本,但是建议同学们自己下载源代码编译,以后万一有坑,还可以尝试自己改改源码. 1.1 https://github.com/apache/activemq/r ...
- ActiveMQ入门示例
1.ActiveMQ下载地址 http://activemq.apache.org/download.html 2.ActiveMQ安装,下载解压之后如下目录
随机推荐
- webgis笔记
3.8(02) .特点:由服务端进行数据管理 开源的GO sever WMS/WCS/WTS 1sever/2engine/3database/4standard 扩展的空间数据库,存矢量.栅格.直接 ...
- eclipse Java EE 与 Java 区别
1. 综述 eclipse IDE 一般来说有三种可切换的模式 Java EE Java 调试 可直接下拉至底部看两者的比较. 2. Java Java 是带有用户界面的 基本IDE ,缺少数据库和w ...
- HTML引入文件/虚拟目录/绝对路径与相对路径
此篇引见 相对路径和绝对路径的区别 1.绝对路径 使用方法:而绝对路径可以使用“\”或“/”字符作为目录的分隔字符 绝对路径是指文件在硬盘上真正存在的路径.例如 <body backround= ...
- 关于 TCP 和 UDP 协议
TCP\UDP 两者区别总结:https://blog.csdn.net/striveb/article/details/84063712 图解HTTP,状态码,TCP.UDP等网络协议相关总结(持续 ...
- springboot访问请求404问题
新手在刚接触springboot的时候,可能会出现访问请求404的情况,代码没问题,但就是404. 疑问:在十分确定代码没问题的时候,可以看下自己的包是不是出问题了? 原因:SpringBoot 注解 ...
- yuyuecms 1.2文件删除漏洞
www.yuyue-cms.com yuyuecms版本1.2 管理员/索引控制器删除方法中的漏洞 请参阅catfishcmsCatfish isPost静态方法 如果调用后验证静态方法 如果为tru ...
- mysql统计指定数据库的各表的条数
mysql统计指定数据库的各表的条数 SELECT table_schema,table_name,table_rows,CREATE_TIME FROM TABLES WHERE TABLE_SCH ...
- 大道至简伪代码读后感java为代码形式
//愚公移山 import.java.大道至简.*; import.java.愚公移山.*; public class yishan //定义一个名为yishan的类 {//类定义的开始 public ...
- SecureCRT8.3
https://blog.csdn.net/dff1993/article/details/81189610 这篇文章我试过,成功激活了SecureCRT8.3
- jumpserver_跳板机实操
首先,jumpserver是什么呢? Jumpserver 是一款由Python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent. 特点: 完全开 ...