消息中间件系列之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 创建目录.写入文件 ...
随机推荐
- python学习笔记013——模块中的私有属性
1 私有属性的使用方式 在python中,没有类似private之类的关键字来声明私有方法或属性.若要声明其私有属性,语法规则为: 属性前加双下划线,属性后不加(双)下划线,如将属性name私有化,则 ...
- fcntl函数用法详解
功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd) ...
- 山东大学硕士/博士研究生毕业论文--Latex模板
山东大学硕士/博士研究生毕业论文Latex模板 模板下载地址: https://github.com/Tsingke/SDU_thesis_template_for_postgraduate 封皮预 ...
- 有关UITableviewCell 重用内存 内部解析
重用实现分析 查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构 ...
- 让easyui的datagrid的field支持属性的子属性(field.childfield)
如果不修改后台返回的数据格式,就只能修改easyui的源代码了. 首先在easyui的源代码中找到下面的部分,VS可以用 “var.*_.+=.*_.+\[.*_.+\];” 这个正则表达式来查找,会 ...
- 有关VS中单元测试的一些问题
需要config的测试 测试中如果调用的类库需要使用config文件读取配置,可以通过在测试项目中建立App.config,并添加相应字段即可.
- JS动态增加删除UL节点LI
JS如何动态增加删除UL节点LI及相关内容. <ul id="ul"> <li id=1>11111111111111111<a href=" ...
- C#操作txt文件并清空添加操作
C#操作txt文件,进行清空添加操作的例子.代码: //把txt清空 FileStream stream = File.Open(Adr,FileMode.OpenOrCreate,FileAcces ...
- netty深入学习之中的一个: 入门篇
netty深入学习之中的一个: 入门篇 本文代码下载: http://download.csdn.net/detail/cheungmine/8497549 1)Netty是什么 Netty是Java ...
- angular学习笔记(四)- input元素的ng-model属性
input元素的ng-model属性: 用于将input的值和变量的值进行双向绑定 <!DOCTYPE html> <html ng-app> <head> < ...