消息中间件系列之Java API操作ActiveMQ
一、依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-client</artifactId>
<version>5.14.4</version>
</dependency>
二、编码
1. P2P模式
/**
*
* @ClassName: Producer
* @Description: 消息生产者
*
*/
public class Producer {
private static final String QUEUE_NAME = "activemq_queue";
public static void main(String[] args) throws Exception {
//1.创建一个连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.2.12:61616");
//2.使用工厂创建Connection
Connection connection = factory.createConnection();
//3.开启连接
connection.start();
//4.创建一个Session
//第一个参数:是否开启事务(一般不开启),如果开启事务,第二个参数无意义
//第二个参数:应答模式(自动/手动)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.通过Session创建一个Destination对象,两种形式:queue、topic
Queue queue = session.createQueue(QUEUE_NAME);
//6.通过Session创建一个Producer对象
MessageProducer producer = session.createProducer(queue);
//7.创建Message对象
// TextMessage message = new ActiveMQTextMessage();
// message.setText("");
TextMessage textMessage = session.createTextMessage("hello world");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close();
}
}
/**
*
* @ClassName: Consumer
* @Description: 消息消费者
*
*/
public class Consumer {
private static final String QUEUE_NAME = "activemq_queue";
public static void main(String[] args) throws Exception {
// 1.创建一个连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.2.12:61616");
// 2.使用工厂创建Connection
Connection connection = factory.createConnection();
// 3.开启连接
connection.start();
// 4.创建一个Session
// 第一个参数:是否开启事务(一般不开启),如果开启事务,第二个参数无意义
// 第二个参数:应答模式(自动/手动)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.通过Session创建一个Destination对象,两种形式:queue、topic
Queue queue = session.createQueue(QUEUE_NAME);
// 6.通过Session创建一个Consumer对象
MessageConsumer consumer = session.createConsumer(queue);
// 7.接收消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
// 8.处理消息
TextMessage textMessage = (TextMessage)message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//为了正常测试,此处使用阻塞,使监听器能持续监听消息
System.in.read();
// 9.关闭资源
consumer.close();
session.close();
connection.close();
}
}
p2p模式只允许有一个消费方,消息生产方生产消息放入队列后,消费方从队列中获取消息进行消费。
启动消息生产者,生产消息,如图:

启动消息消费者,消费消息,如图:

消息消费后,后台管理信息,如图:

2.publish/subscribe模式
/**
*
* @ClassName: Producer
* @Description: 消息生产方
*
*/
public class Producer {
private static final String TOPIC_NAME = "activemq_topic";
public static void main(String[] args) throws Exception {
//1.创建一个连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.2.12:61616");
//2.使用工厂创建Connection
Connection connection = factory.createConnection();
//3.开启连接
connection.start();
//4.创建一个Session
//第一个参数:是否开启事务(一般不开启),如果开启事务,第二个参数无意义
//第二个参数:应答模式(自动/手动)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//5.通过Session创建一个Destination对象,两种形式:queue、topic
Topic topic = session.createTopic(TOPIC_NAME);
//6.通过Session创建一个Producer对象
MessageProducer producer = session.createProducer(topic);
//7.创建Message对象
// TextMessage message = new ActiveMQTextMessage();
// message.setText("");
TextMessage textMessage = session.createTextMessage("hello world topic");
//8.发送消息
producer.send(textMessage);
//9.关闭资源
producer.close();
session.close();
connection.close();
}
}
/**
*
* @ClassName: Comsumer1
* @Description: 消息消费方
*
*/
public class Comsumer1 {
private static final String TOPIC_NAME = "activemq_topic";
public static void main(String[] args) throws Exception {
// 1.创建一个连接工厂
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.2.12:61616");
// 2.使用工厂创建Connection
Connection connection = factory.createConnection();
// 3.开启连接
connection.start();
// 4.创建一个Session
// 第一个参数:是否开启事务(一般不开启),如果开启事务,第二个参数无意义
// 第二个参数:应答模式(自动/手动)
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.通过Session创建一个Destination对象,两种形式:queue、topic
Topic topic = session.createTopic(TOPIC_NAME);
// 6.通过Session创建一个Consumer对象
MessageConsumer consumer = session.createConsumer(topic);
// 7.接收消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
// 8.处理消息
TextMessage textMessage = (TextMessage)message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.out.println("消费者1已经启动");
System.in.read();
// 9.关闭资源
consumer.close();
session.close();
connection.close();
}
}
ps模式启动了2个消费者,Consumer2代码与Comsumer1代码一致,因此在此处省略。
1) 当我们先启动消费生产者,生产消息,再启动消息消费者后,发现,消费者并没有消费消息。
2) 当我们先启动两个消息消费者后,再启动消息生产者,结果如图:



ps模式允许有多个消费方消费同一个主题消息。相当于微信公众号,服务端发送一条消息,订阅该公众号的客户端都能看到该消息,但是不能查看在订阅之前服务端发送的消息。
消息中间件系列之Java API操作ActiveMQ的更多相关文章
- Kafka系列三 java API操作
使用java API操作kafka 1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...
- hive-通过Java API操作
通过Java API操作hive,算是测试hive第三种对外接口 测试hive 服务启动 package org.admln.hive; import java.sql.SQLException; i ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
- 使用Java API操作HDFS文件系统
使用Junit封装HFDS import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.*; import org ...
- Hadoop之HDFS(三)HDFS的JAVA API操作
HDFS的JAVA API操作 HDFS 在生产应用中主要是客户端的开发,其核心步骤是从 HDFS 提供的 api中构造一个 HDFS 的访问客户端对象,然后通过该客户端对象操作(增删改查)HDFS ...
- MongoDB Java API操作很全的整理
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...
- zookeeper的java api操作
zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...
- java api操作
java api操作 导入开发包 将hbase安装包中lib下包导入java项目 创建表 Configuration conf = HBaseConfiguration.create(); c ...
- HDFS 05 - HDFS 常用的 Java API 操作
目录 0 - 配置 Hadoop 环境(Windows系统) 1 - 导入 Maven 依赖 2 - 常用类介绍 3 - 常见 API 操作 3.1 获取文件系统(重要) 3.2 创建目录.写入文件 ...
随机推荐
- C#Copy
1.浅拷贝(值类型): public class LightCopy { public int Val { get; set; } public LightCopy(int ival) { Val = ...
- activity的onCreate参数 saveInstanceState
写过Android程序的都知道Activity中有一个名称叫onCreate的方法.该方法是在Activity创建时被系统调用,是一个Activity生命周期的开始.可是有一点容易被忽视,就是 ...
- python dataframe 在merge时 产生笛卡尔积
在pandas中,concat, merge, join的使用方法可以参考以下资料: http://blog.csdn.net/stevenkwong/article/details/52528616 ...
- mysql 5.7安装教程
一.mysql下载地址 https://downloads.mysql.com/archives/installer/ 说在前面的话 我为什么已经尝试和使用过同类型产品的很多MySQL版本,还要书写 ...
- 如何判断SCI期刊投稿难易度和审稿周期
如何判断SCI期刊投稿难易度和审稿周期 要发SCI论文,前提当然是必须有一篇写好的英文论文,SCI都是英文的杂志,这个大家应该都懂的 首先谈谈投稿难易程度很多人似乎都一种误解,认为拒稿率高的杂 ...
- Linux中Nginx安装与配置详解 test(待整理 补全)
http://www.linuxidc.com/Linux/2016-08/134110.htm http://www.cnblogs.com/freeweb/p/5425554.html http: ...
- 【转】js frame 框架编程
源地址:http://www.blogjava.net/lusm/archive/2008/02/11/179620.html 1 框架编程概述 一个Html 页面可以有一个或多个子框架,这些子框架以 ...
- js左侧三级菜单导航实例代码
在左侧三级菜单导航想必大家都见到过吧,它的实现过程也并不复杂,下面有个不错的示例,感兴趣的朋友可以了解下 实例代码: <!DOCTYPE html PUBLIC "-//W3C// ...
- 【Android】11.4 Fragment及其生命周期
分类:C#.Android.VS2015: 创建日期:2016-02-22 一.简介 Android从3.0开始引入了fragment的概念,主要是为了支持在大屏幕上实现更为动态和灵活的UI设计,比如 ...
- 【Android】7.5 RelativeLayout(相对布局)
分类:C#.Android.VS2015: 创建日期:2016-02-11 一.简介 RelativeLayout是一种相对布局,容器中子元素的位置是相对于其前一个元素或者其他元素的位置来计算的,或者 ...