一、安装与启动

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. (原创)Hibernate 使用过程中(尤其是多对多关联中的级联保存和级联删除)的注意事项(基于项目的总结)

    一.先上知识点: 1.hibernate多对多关联关系中最重要的参数是(基于配置文件xxx.hbm.xml文件形式): 1):inverse属性,如果设置inverse=“true”就代表让对方参与维 ...

  2. Spring 注入集合类型

    定义了一个类: @Service public class StringTest implements CachedRowSet,SortedSet<String>,Cloneable @ ...

  3. 实现EventHandler的监测

    的监测", "category":"", "tags":"", "publish":&qu ...

  4. HttpClient4.X发送Get请求的url参数拼接

    HttpClient4.X发送Get请求的参数拼接 使用httpClient发送get请求时,请求参数可以以?key=val&key1=val1的拼接到url后面. 但是请求参数较多时,这种方 ...

  5. [JS] IE下ajax请求不生效或者请求结果不更新

    问题描述: IE8及以下版本里用jQuery发简单的GET时,第一次或者新开窗口后的请求没问题,可以正确返回结果.但是之后刷新页面或者触发某些操作得到的ajax请求结果永远和第一次一样. 问题分析: ...

  6. java spring boot 开启监控信息

    效果: 配置 // pom <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  7. C语言 IPv6 十六进制 转 十进制

    #include <stdio.h> #include <string.h> #include <math.h> //ipv4地址转换 int ipv4_to_i( ...

  8. A Tool to Clip Images

    using Microsoft.Win32; using System; using System.IO; using System.Text.RegularExpressions; using Sy ...

  9. Exp2 后门原理与实践 20164321 王君陶

    Exp2 后门原理与实践 20164321 王君陶 一.实验内容 基础问题回答: 1.例举你能想到的一个后门进入到你系统中的可能方式? 答:通过漏洞,点击陌生链接,或者浏览不良网页挂马. 2.例举你知 ...

  10. Android逆向系列文章— Android基础逆向(6)

    本文作者:HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1) Android逆向-Android基础逆向(2) Android逆向-Android基础逆向(2 ...