JMS消息中间件之ActiveMQ学习
1、下载
下载二进制bin文件:http://activemq.apache.org/activemq-5132-release.html

下载源码:

2、启动:
解压任意路径:

启动后:

3、访问:
访问http://localhost:8161/admin/ 用户名&密码:admin
4、主要应用:


5、点对点消息发送&接收
首先是producer方:
package com.activemq.test; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消息生产者
*
* @author Administrator
*
*/
public class JMSProducer { private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; // 默认连接用户
private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; // 默认连接密码
private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; // 默认消息总线 private static final int SENDNUM = 10; // 发送消息总量 public static void main(String[] args) { ConnectionFactory connectionFactory = null; // 连接工厂
Connection connection = null; // 连接对象 Session session = null; // 会话级session,接收或发送消息的线程
Destination destination = null; // 消息发送的目的地 MessageProducer messageProducer = null; // 消息生产者 connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD,
JMSProducer.BROKERURL);
try {
connection = connectionFactory.createConnection(); connection.start(); // 启动连接 session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 创建session,true表示添加事务 destination = session.createQueue("FirstQueue"); // 创建消息队列 messageProducer = session.createProducer(destination); // 创建消息生产者 sendMessage(session, messageProducer); session.commit(); //commit提交
} catch (Exception e) {
e.printStackTrace();
}finally {
if(connection != null){
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
} /**
* 发送消息
*
* @param session
* @param messageProducer
* @throws Exception
*/
public static void sendMessage(Session session, MessageProducer messageProducer) throws Exception {
for (int i = 0; i < SENDNUM; i++) {
TextMessage textMessage = session.createTextMessage("Active MQ消息"+i); //文本消息
System.out.println("发送消息: Active MQ消息"+i);
messageProducer.send(textMessage);
}
} }
然后是消费方实现,主要有两种,一种是直接receive方法接收消息,一种是通过监听实现:
receive:
package com.activemq.test; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消息消费者
* 普通receive方式接收消息
* @author Administrator
*
*/
public class JMSConsumer { private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; // 默认连接用户
private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; // 默认连接密码
private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; // 默认消息总线
public static void main(String[] args) { ConnectionFactory connectionFactory = null; // 连接工厂
Connection connection = null; // 连接对象 Session session = null; // 会话级session,接收或发送消息的线程
Destination destination = null; // 消息发送的目的地 MessageConsumer messageConsumer = null; //消息消费者 connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD,
JMSConsumer.BROKERURL); try {
connection = connectionFactory.createConnection(); connection.start(); // 启动连接 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建session,false表示不添加事务 destination = session.createQueue("FirstQueue"); // 创建消息队列 messageConsumer = session.createConsumer(destination); // 创建消息消费者 while (true) {
TextMessage textMessage = (TextMessage)messageConsumer.receive(100000); //接收消息(文本消息)
if(textMessage != null){
System.out.println("接收到的消息:"+textMessage.getText());
}else{
break;
}
}
} catch (JMSException e) {
e.printStackTrace();
} } }
监听方式:
package com.activemq.test; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; /**
* 消息监听
* @author Administrator
*
*/
public class Listener implements MessageListener{ @Override
public void onMessage(Message message) { try {
System.out.println("接收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
} }
}
package com.activemq.test; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消息消费者
* 普通receive方式接收消息
* @author Administrator
*
*/
public class JMSConsumer2 { private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; // 默认连接用户
private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; // 默认连接密码
private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; // 默认消息总线
public static void main(String[] args) { ConnectionFactory connectionFactory = null; // 连接工厂
Connection connection = null; // 连接对象 Session session = null; // 会话级session,接收或发送消息的线程
Destination destination = null; // 消息发送的目的地 MessageConsumer messageConsumer = null; //消息消费者 connectionFactory = new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD,
JMSConsumer2.BROKERURL); try {
connection = connectionFactory.createConnection(); connection.start(); // 启动连接 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建session,false表示不添加事务 destination = session.createQueue("FirstQueue"); // 创建消息队列 messageConsumer = session.createConsumer(destination); // 创建消息消费者 messageConsumer.setMessageListener(new Listener()); //注册监听
} catch (JMSException e) {
e.printStackTrace();
} } }
几轮测试下来,消费生产记录:

6、发布订阅模式
新建订阅1:
package com.activemq.test2; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消息消费者 -- 消息订阅者1
* 普通receive方式接收消息
* @author Administrator
*
*/
public class JMSConsumer { private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; // 默认连接用户
private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; // 默认连接密码
private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; // 默认消息总线
public static void main(String[] args) { ConnectionFactory connectionFactory = null; // 连接工厂
Connection connection = null; // 连接对象 Session session = null; // 会话级session,接收或发送消息的线程
Destination destination = null; // 消息发送的目的地 MessageConsumer messageConsumer = null; //消息消费者 connectionFactory = new ActiveMQConnectionFactory(JMSConsumer.USERNAME, JMSConsumer.PASSWORD,
JMSConsumer.BROKERURL); try {
connection = connectionFactory.createConnection(); connection.start(); // 启动连接 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建session,false表示不添加事务 destination = session.createTopic("SecondTopic"); // 创建消息订阅 messageConsumer = session.createConsumer(destination); // 创建消息消费者 messageConsumer.setMessageListener(new Listener()); //注册监听
} catch (JMSException e) {
e.printStackTrace();
} } }
package com.activemq.test2; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; /**
* 消息监听-消息订阅者1的监听
* @author Administrator
*
*/
public class Listener implements MessageListener{ @Override
public void onMessage(Message message) { try {
System.out.println("订阅者1接收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
} }
}
订阅2:
package com.activemq.test2; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageConsumer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消息消费者 -- 消息订阅者2
* 普通receive方式接收消息
* @author Administrator
*
*/
public class JMSConsumer2 { private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; // 默认连接用户
private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; // 默认连接密码
private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; // 默认消息总线
public static void main(String[] args) { ConnectionFactory connectionFactory = null; // 连接工厂
Connection connection = null; // 连接对象 Session session = null; // 会话级session,接收或发送消息的线程
Destination destination = null; // 消息发送的目的地 MessageConsumer messageConsumer = null; //消息消费者 connectionFactory = new ActiveMQConnectionFactory(JMSConsumer2.USERNAME, JMSConsumer2.PASSWORD,
JMSConsumer2.BROKERURL); try {
connection = connectionFactory.createConnection(); connection.start(); // 启动连接 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建session,false表示不添加事务 destination = session.createTopic("SecondTopic"); // 创建消息订阅 messageConsumer = session.createConsumer(destination); // 创建消息消费者 messageConsumer.setMessageListener(new Listener2()); //注册监听
} catch (JMSException e) {
e.printStackTrace();
} } }
package com.activemq.test2; import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage; /**
* 消息监听-消息订阅者1的监听
* @author Administrator
*
*/
public class Listener2 implements MessageListener{ @Override
public void onMessage(Message message) { try {
System.out.println("订阅者2接收到的消息:"+((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
} }
}
消息一定要先订阅,然后producer再发布,否则先发布再订阅的话后边才订阅的一方是收不到之前发布的消息的!
然后是发布方:
package com.activemq.test2; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; /**
* 消息生产者
*
* @author Administrator
*
*/
public class JMSProducer { private static final String USERNAME = ActiveMQConnectionFactory.DEFAULT_USER; // 默认连接用户
private static final String PASSWORD = ActiveMQConnectionFactory.DEFAULT_PASSWORD; // 默认连接密码
private static final String BROKERURL = ActiveMQConnectionFactory.DEFAULT_BROKER_URL; // 默认消息总线 private static final int SENDNUM = 10; // 发送消息总量 public static void main(String[] args) { ConnectionFactory connectionFactory = null; // 连接工厂
Connection connection = null; // 连接对象 Session session = null; // 会话级session,接收或发送消息的线程
Destination destination = null; // 消息发送的目的地 MessageProducer messageProducer = null; // 消息生产者 connectionFactory = new ActiveMQConnectionFactory(JMSProducer.USERNAME, JMSProducer.PASSWORD,
JMSProducer.BROKERURL);
try {
connection = connectionFactory.createConnection(); connection.start(); // 启动连接 session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 创建session,true表示添加事务 destination = session.createTopic("SecondTopic"); // 创建发布主题 messageProducer = session.createProducer(destination); // 创建消息发布者 sendMessage(session, messageProducer); session.commit(); // commit提交
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
} /**
* 发送消息
*
* @param session
* @param messageProducer
* @throws Exception
*/
public static void sendMessage(Session session, MessageProducer messageProducer) throws Exception {
for (int i = 0; i < SENDNUM; i++) {
TextMessage textMessage = session.createTextMessage("Active MQ发布消息" + i); // 文本消息
System.out.println("发送消息: Active MQ 发布的消息" + i);
messageProducer.send(textMessage);
}
}
}
运行效果查看:

JMS消息中间件之ActiveMQ学习的更多相关文章
- JMS消息中间件系列[ActiveMQ](一)
版本5.13.3的特性: 1.Supports a variety of Cross Language Clients and Protocols from Java, C, C++, C#, Rub ...
- ActiveMQ学习笔记(5)——使用Spring JMS收发消息
摘要 ActiveMQ学习笔记(四)http://my.oschina.net/xiaoxishan/blog/380446 中记录了如何使用原生的方式从ActiveMQ中收发消息.可以看出,每次 ...
- 【ActiveMQ】Spring Jms集成ActiveMQ学习记录
Spring Jms集成ActiveMQ学习记录. 引入依赖包 无论生产者还是消费者均引入这些包: <properties> <spring.version>3.0.5.REL ...
- 学习笔记-记ActiveMQ学习摘录与心得(一)
这两天在看开源的MQ技术,趁着晚上安静,把这两天学的东西摘录下.在公司学东西效率真心捉鸡,心里总觉得别扭,拿了公司的钱不干活还在那学习,表示心情不淡定,效率不行啊...晚上时间是我的,下班还是蛮开心的 ...
- ActiveMQ学习教程/1.简要介绍与安装
ActiveMQ学习教程(一)——简要介绍与安装 一.名词: 1.JMS:即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的 ...
- ActiveMQ学习总结(一)
自己写的网上商城项目中使用了ActiveMQ,虽然相比于RabbitMQ,kafka,RocketMQ等相比,ActiveMQ可能性能方面不是最好的选择,不过消息队列其实原理区别不大,这里对学过的关于 ...
- 手把手教你如何玩转消息中间件(ActiveMQ)
手把手教你如何玩转消息中间件(ActiveMQ) 2018年07月15日 18:07:39 Cs_hnu_scw 阅读数 12270 标签: 中间件消息中间件ActiveMQ分布式集群 更多 个人分类 ...
- ActiveMQ学习总结------原生实战操作(下)03
本篇将继续延续上一篇的内容,作为知识补充篇,为接下来我们学习spring整合ActiveMQ打好基础 本篇主要学习内容: 1.ActiveMQ 队列服务监听 2.ActiveMQ Topic模型 回顾 ...
- ActiveMQ学习教程/2.简单示例
ActiveMQ学习教程(二)——简单示例 一.应用IDEA构建Maven项目 File->New->Module...->Maven->勾选->选择->Next ...
随机推荐
- leetcode 2 两数相加 JAVA
题目: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示 ...
- windbg 常用命令详解
= kd> ln 8046e100 (8046e100) nt!KeServiceDescriptorTableShadow | (8046e140) nt!MmSectionExtendRes ...
- pandas set_index() reset_index()
set_index() 官方定义: 使用一个或多个现有列设置索引, 默认情况下生成一个新对象 DataFrame.set_index(keys, drop=True, append=False, ...
- 【SSO单点系列】开篇
年底将至,忙碌了好几个月的项目也接近尾声了.在这个项目中,由于要和其他外系统做单点登录(SSO),整合其他系统的功能.在网上查询了相关资料后,最终选取了Yale大学发起的一个开源项目 CAS, 作为项 ...
- Extjs在form展示后台单个对象的属性
目的:写一个按钮事件,点击时弹出一个win窗体,里面镶嵌form表单,并且展示后台单个对象的属性 先来后台: public void find(){ String clientId = request ...
- TCP/IP协议之分层
 应用层和运输层只在端系统(End System)中实现, 底层协议在中间系统(Intermediate System)实现 ICMP和IGMP属于网络层的附属协议.虽然其内容是IP数据报的载荷(P ...
- UIViewController读书笔记
当一个VC把另一个VC作为子view加到自己的view时,一定要先调用addChildViewController(_:)方法. 因为一个VC的root view,也就是VC的view只能被这个VC持 ...
- 在iOS7中修改键盘Return键的类型
今天将之前运行在iOS7之前的一段代码拿出来,在iOS7的机器上运行,发现键盘上的ReturnKeyType不能被修改了. 经过几番查找资料,了解到iOS7中UISearchBar的结构发生了变化,将 ...
- linux源码中的核心数据结构
寄存器 pt_regs 进程线程 struct task_struct: 进程,或者是线程数据结构,在include/linux/sched.h里面定义的,与硬件体系结构无关 struct threa ...
- C#获取当前程序集的完整路径
//获取当前程序集的完整路径加上EXE的名称 string binPath = Assembly.GetExecutingAssembly().Location; Console.WriteLine( ...