一、安装与启动

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的三种通信方式的更多相关文章

  1. spring与activemq(三种消息监听方式)

    1.3     消息监听器MessageListener 在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.Sessio ...

  2. 应用六:Vue之父子组件间的三种通信方式

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 组件是Vue的核心功能之一,也是我们在开发过程中经常要用到的.各个独立的组件之间如何进行数据 ...

  3. WCF三种通信方式

    一.概述 WCF在通信过程中有三种模式:请求与答复.单向.双工通信.以下我们一一介绍. 二.请求与答复模式 描述: 客户端发送请求,然后一直等待服务端的响应(异步调用除外),期间处于假死状态,直到服务 ...

  4. vue的三种通信方式

    一 确定组件关系二 使用第一步确定的组件关系在下面找到使用方法 1 父子通信(子组件使用父组件数据渲染) a) 在 子组件 中添加props props: [自定义prop名字] b) 在子组件中把自 ...

  5. 基于Linux的USB 主/从设备之间通讯的三种方式

    转载:http://archive.eet-china.com/www.eet-china.com/ART_8800323770_617693_TA_eda530e7.HTM 随着简单易用的USB接口 ...

  6. Vue组件之间通信的三种方式

    最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...

  7. activemq的几种基本通信方式总结

    简介 在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择.这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨.activem ...

  8. activemq的两种基本通信方式的使用及总结

    简介 在前面一篇文章里讨论过几种应用系统集成的方式,发现实际上面向消息队列的集成方案算是一个总体比较合理的选择.这里,我们先针对具体的一个消息队列Activemq的基本通信方式进行探讨.activem ...

  9. ActiveMQ持久化消息的三种方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt362 本文只介绍三种方式,分别是持久化为文件,MYSql,Oracle.下面 ...

随机推荐

  1. [翻译][HTML]CELLPADDING and CELLSPACING

    w3school手册:http://www.w3schools.com/tags/att_table_cellspacing.asp 一直以来都发现自己对cellpadding&cellspa ...

  2. Java泛型与Restlet客户端

    写一个与restlet服务器通信的客户端类,用于测试通信是否成功,并且进行交互.为了方便其他人使用,于是,写一个通用的方法封装起来,可是中途却放生了一些问题. 按照正常写法,顺序走下来是这样的: pu ...

  3. Python初学手记----在window系统中安装环境

    官网地址: https://www.python.org/ Win版下载地址:https://www.python.org/downloads/windows/ 安装注意:安装路径推荐修改. path ...

  4. 使用xargs与awk联合使用批量杀进程,很方便

    ps -ef | grep java | grep alarm | awk '{print $2}' | xargs kill -9 注*A.  $2表示第2列,即进程号PID; awk很强大,这里不 ...

  5. app开发技术调研

    l  面向消费者与公众的应用系统,主要分为3种主流的渠道: 1.   web应用 2.   基于腾讯微信开放api构建的微信app 3.   移动端app ll 在移动端app方面,通过调研,现主流的 ...

  6. OpenStack 数据库操作 demo

    #!/usr/bin/env python from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine f ...

  7. 对表单控制是否提交 需要在方法名前面加上 return

  8. ZZNU 2076(退役学长最后的神功 zz题)

    题目链接:http://acm.zznu.edu.cn/problem.php?pid=2076 输入一个T表示有T个样例每组实例一个整数n(0〈n〈1000接下来输入2*n个数字,代表一个2*n的矩 ...

  9. jmeter测试计划配置

    用户定义的变量: 测试计划上可以添加用户定义的变量.一般添加一些系统常用的配置.如果测试过程中想切换环境,切换配置,一般不建议在测试计划上添加变量,因为不方便启用和禁用,一般是直接添加用户自定义变量组 ...

  10. Swift 里集合类型协议的关系

      Sequence A type that provides sequential, iterated access to its elements. 是最基础的协议,可以通过迭代来获取它的元素 ...