activemq的三种通信方式
一、安装与启动
1.下载安装activemq,下载地址:http://activemq.apache.org/download.html。
2.安装完成后,进入其所在目录的bin目录下面,根据系统位数选择进入win32或者win64目录。
3.双击activemq.bat 文件进行启动,需要安装Java8,配置JAVA_HOME环境变量(注意:计算机名称不能有下划线)。
4.启动完后在浏览器访问 http://127.0.0.1:6181,点击如下选项,然后在弹出的界面输入用户名 admin 密码 admin进入管理页面。
二、三种通信方式
1、操作的主要步骤
(1). 获得JMS connection factory. 通过我们提供特定环境的连接信息来构造factory。
(2). 利用factory构造JMS connection
(3). 启动connection
(4). 通过connection创建JMS session.
(5). 指定JMS destination.
(6). 创建JMS producer或者创建JMS message并提供destination.
(7). 创建JMS consumer或注册JMS message listener.
(8). 发送和接收JMS message.
(9). 关闭所有JMS资源,包括connection, session, producer, consumer等。
2、activemq的连接
创建一个maven项目,加入如下依赖。
<dependencies> <dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.15.4</version>
</dependency> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
mq连接代码
import org.apache.activemq.ActiveMQConnectionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Session; public class MqUtils { static Logger logger = LoggerFactory.getLogger(MqUtils.class);
private static final String URL="tcp://118.24.115.208:61616"; //连接地址
private static final String USER_NAME="admin"; //用户名
private static final String PASSWORD="admin"; //密码
private static Connection connection =null;
private static Session session=null; private MqUtils(){} /**
* 获取session 一个发送或者接受消息的线程
* @return
* @throws JMSException
*/
public static Session getSession() throws JMSException {
//获取连接工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USER_NAME,PASSWORD,URL);
if(null == connection){
//获取连接
connection = connectionFactory.createConnection();
connection.start();
logger.info("连接创建成功");
}
if(null == session){
//获取session对象
session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
logger.info("session创建成功");
}
return session;
} /**
* 关闭session和连接
* @throws JMSException
*/
public static void closeSession() {
if(null != session){
try {
session.close();
logger.info("session关闭");
} catch (JMSException e) {
e.printStackTrace();
}
}
if(null != connection){
try {
connection.close();
logger.info("连接关闭");
} catch (JMSException e) {
e.printStackTrace();
}
}
} }
3.第一种通信方式 P2P
p2p的过程则理解起来更加简单。它好比是两个人打电话,这两个人是独享这一条通信链路的。一方发送消息,另外一方接收,就这么简单。在实际应用中因为有多个用户对使用p2p的链路,它的通信场景如下图所示:
在p2p的场景里,相互通信的双方是通过一个类似于队列的方式来进行交流。
代码实现:
Provider代码:
import com.jack.util.MqUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.*; public class QueryProvider { static Logger logger = LoggerFactory.getLogger(QueryProvider.class);
public static void main(String[] args) { try {
//获取session 一个发送消息的线程
Session session = MqUtils.getSession();
//设置消息发送的目的地
Queue destination = session.createQueue("Queue B");
//获取消息发送者
MessageProducer producer = session.createProducer(destination);
//设置不持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//发送消息
logger.info("开始发送消息");
sendMessage(session,producer);
//提交,只有提交了消息才会正真发送
session.commit();
logger.info("消息发送完毕");
} catch (JMSException e) {
e.printStackTrace();
}finally {
//关闭连接
MqUtils.closeSession();
}
} /**
* 发送文本消息
* @param session session对象
* @param producer 消息发送者
* @throws JMSException
*/
public static void sendMessage(Session session,MessageProducer producer) throws JMSException { //构造文本消息
TextMessage textMessage = session.createTextMessage("{\"name\":\"zhangsan\",\"age\":35,\"sex\":\"male\",\"marry\":false}");
logger.info("发送消息");
//发送消息
producer.send(textMessage); }
}
consumer代码实现:
import com.jack.util.MqUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.*; public class QueueConsumer { static Logger logger = LoggerFactory.getLogger(QueueConsumer.class); public static void main(String[] args) {
try {
Session session = MqUtils.getSession();
Queue destination = session.createQueue("Queue B");
MessageConsumer consumer = session.createConsumer(destination); consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
logger.info(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
try {
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
}
});
} catch (JMSException e) {
e.printStackTrace();
}
}
}
4、第二种通信方式 publish-subscribe
发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸,那么对于我们每一个订阅者来说,我们可以选择一份或者多份报纸。比如北京日报、潇湘晨报等。那么这些个我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。那么,在这里,相当于我们在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。这种关系如下图所示:
代码实现如下:
Provider代码:
import com.jack.util.MqUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.*; public class TopicProvider { static Logger logger = LoggerFactory.getLogger(TopicProvider.class); /**
* 测试消息发布
* @param args
*/
public static void main(String[] args) {
try {
//获取session
Session session = MqUtils.getSession();
//制定发布地址
Topic topic = session.createTopic("Topic A");
//消息发布者
MessageProducer producer = session.createProducer(topic);
//设置不持久化
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
logger.info("开始发送消息");
//发送消息
sendMessage(session,producer);
//提交
session.commit();
logger.info("消息发送结束");
} catch (JMSException e) {
e.printStackTrace();
}finally {
//关闭session和连接
MqUtils.closeSession();
}
} /**
* 发送消息
* @param session 一个发送消息的线程
* @param messageProducer 消息发送者
* @throws JMSException
*/
public static void sendMessage(Session session,MessageProducer messageProducer) throws JMSException {
//构造文本消息
TextMessage message = session.createTextMessage("{\"name\":\"zhangsan\"}");
//发送消息
messageProducer.send(message);
}
}
Consumer代码:
import com.jack.util.MqUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.*; public class TopicConsumer { static Logger logger = LoggerFactory.getLogger(TopicConsumer.class); public static void main(String[] args) {
try {
//获取session
Session session = MqUtils.getSession();
//设置订阅地址
Topic destination = session.createTopic("Topic A");
//订阅消息
MessageConsumer consumer = session.createConsumer(destination);
//消息监听(有事务限制)
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//接收消息
TextMessage textMessage = (TextMessage) message;
try {
logger.info(textMessage.getText());
//提交
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
}
}); } catch (JMSException e) {
e.printStackTrace();
}
}
}
5.第三种通信方式 request-response
和前面两种方式比较起来,request-response的通信方式很常见,但是不是默认提供的一种模式。在前面的两种模式中都是一方负责发送消息而另外一方负责处理。而我们实际中的很多应用相当于一种一应一答的过程,需要双方都能给对方发送消息。于是请求-应答的这种通信方式也很重要。它也应用的很普遍。
请求-应答方式并不是JMS规范系统默认提供的一种通信方式,而是通过在现有通信方式的基础上稍微运用一点技巧实现的。下图是典型的请求-应答方式的交互过程:
在JMS里面,如果要实现请求/应答的方式,可以利用JMSReplyTo和JMSCorrelationID消息头来将通信的双方关联起来。另外,QueueRequestor和TopicRequestor能够支持简单的请求/应答过程。
代码实现如下:
Provider代码:
import com.jack.util.MqUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.*; public class DoubleConsumer { static Logger logger = LoggerFactory.getLogger(DoubleConsumer.class); public static void main(String[] args) {
try {
//获取session
Session session = MqUtils.getSession();
//设置消息地址
Destination destination = session.createQueue("DoubleA");
//创建消息发送者
MessageProducer messageProducer = session.createProducer(null);
//设置不持久化
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//创建消息接受者
MessageConsumer messageConsumer = session.createConsumer(destination);
//监听消息
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//接收消息
TextMessage textMessage = (TextMessage) message;
try {
//接收后构造回复消息
TextMessage txtMessage = session.createTextMessage();
String messageText = textMessage.getText();
logger.info(messageText);
txtMessage.setText(messageText);
//设置消息的id,保证每个消息的回复相对应
txtMessage.setJMSCorrelationID(message.getJMSCorrelationID());
//回复消息
messageProducer.send(message.getJMSReplyTo(),txtMessage);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
} }
});
} catch (JMSException e) {
e.printStackTrace();
} }
}
Consumer代码:
import com.jack.util.MqUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.jms.*;
import java.util.UUID; public class DoubleProvider { static Logger logger = LoggerFactory.getLogger(DoubleProvider.class); public static void main(String[] args) {
try {
//获取连接
Session session = MqUtils.getSession();
//设置地址
Destination destination1 = session.createQueue("DoubleA");
//创建消息发送者
MessageProducer messageProducer = session.createProducer(destination1);
//设置消息不持久化
messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
//创建接收消息的地址
Destination destination = session.createTemporaryQueue();
//创建消息接受者
MessageConsumer messageConsumer = session.createConsumer(destination);
//监听消息借口
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
//接收消息
TextMessage textMessage = (TextMessage) message;
try {
logger.info(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//创建消息体
TextMessage textMessage = session.createTextMessage();
textMessage.setText("HYYYY");
//设置消息发送目的地
textMessage.setJMSReplyTo(destination);
String correlationId = UUID.randomUUID().toString();
//设置消息的id
textMessage.setJMSCorrelationID(correlationId);
//发送消息
messageProducer.send(textMessage);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
activemq的三种通信方式的更多相关文章
- spring与activemq(三种消息监听方式)
1.3 消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.Sessio ...
- 应用六:Vue之父子组件间的三种通信方式
(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 组件是Vue的核心功能之一,也是我们在开发过程中经常要用到的.各个独立的组件之间如何进行数据 ...
- WCF三种通信方式
一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...
- vue的三种通信方式
一 确定组件关系二 使用第一步确定的组件关系在下面找到使用方法 1 父子通信(子组件使用父组件数据渲染) a) 在 子组件 中添加props props: [自定义prop名字] b) 在子组件中把自 ...
- 基于Linux的USB 主/从设备之间通讯的三种方式
转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...
- Vue组件之间通信的三种方式
最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...
- activemq的几种基本通信方式总结
简介 在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择.这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨.activem ...
- activemq的两种基本通信方式的使用及总结
简介 在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择.这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨.activem ...
- ActiveMQ持久化消息的三种方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...
随机推荐
- wc.java
GitHub代码链接 1.项目相关要求 •基本功能列表: -c 统计文件中字符的个数 -w 统计文件中的词数 -l 统计文件中的行数 •拓展功能: -a 统计文件中代码行数.注释行数.空行 2 ...
- ORACLE报表触发器
http://www.cnblogs.com/quanweiru/archive/2012/09/26/2704308.html 触发器一.报表触发器(report trigger)报表触发器主要用于 ...
- 成员函数指针与高性能C++委托
1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...
- Java子父类中的构造函数实例化过程
其实我们发现子类继承父类操作很简单,如果要是去深入的研究下会发现,实例化过程并非是我们看到的那样,我们就以代码举例来说明: 问大家,以下代码执行会输出什么呢? package com.oop; /** ...
- Python学习-22.Python中的函数——type
type函数可以检测任何值或变量的类型. 例子: def printType(var): print(type(var)) class TestClass: pass printType(1) pri ...
- LeetCode150:Evaluate Reverse Polish Notation
题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are + ...
- 在Windows安装Reids 详解
今天安装了redis,记录点经验 因为Redis项目没有正式支持Windows. 但Microsoft开发和维护一个针对Windows 64版的redis. 下载地址在微软的GitHub上,地址:ht ...
- XML Web Service架构图
- pageadmin CMS网站建设教程: 附属表数据列表调用语法
列表调用语法 Html.SubDataList(参数1,参数2,参数3,参数4)参数说明: 注:第一个参数对象中必须定义Table或ParentTable/ParentField属性.参数1常用属性: ...
- Java的动态编译、动态加载、字节码操作
想起来之前做的一个项目:那时候是把需要的源代码通过文件流输出到一个.java文件里,然后调用sun的Comipler接口动态编译成.class文件,然后再用专门写的一个class loader加载这个 ...