消息中间件系列之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 模块module 1.1 模块是什么 模块是包含一系列的变量,函数,类等程序组 模块通常是一个文件,以.py结尾 1.2 模块的作用 1. 让一些相关的函数,变量,类等有逻辑的组织在一起,使逻辑更 ...
- Solutions for the Maximum Subsequence Sum Problem
The maximum subarray problem is the task of finding the contiguous subarray within a one-dimensional ...
- 中国计算机学会CCF推荐国际学术期刊会议(最新版)
中国计算机学会推荐国际学术期刊会议 2014年12月,中国计算机学会(CCF)启动新一轮<)计算机体系结构/高性能计算/存储系统: )计算机网络:)网络与信息安全:)软件工程/系统软件/程序设计 ...
- mysql-cluster 环境安装&配置
一.mysql-cluster 的介绍: 1.说心里话mysql-cluster这货性能上是不行的,之前一个同事测试了来的结果是8个主机组成的mysql-cluster性能 上搞不过一个单机的mysq ...
- CentOS配置本地yum源/阿里云yum源/163yuan源,并配置yum源的优先级
一.用Centos镜像搭建本地yum源 由于安装centos后的默认yum源为centos的官方地址,所以在国内使用很慢甚至无法访问,所以一般的做法都是把默认的yum源替换成aliyun的yum源或者 ...
- 使struct对象拥有可变大小的数组——(C++深度探索)
首先摘录<Inside The C++ Object Model>中的一段话: 把单一元素的数组放在一个struct的尾端,于是每个 struct objects 可以拥有可变大小的数组: ...
- activiti自己定义流程之Spring整合activiti-modeler实例(一):环境搭建
项目中须要整合activiti-modeler自己定义流程,找了非常多资料后,最终成功的跳转到activiti-modeler流程设计界面.下面是记录: 一.整合基础:eclipse4.4.1.tom ...
- angular学习笔记(十九)-指令修改dom
本篇主要介绍angular使用指令修改DOM: 使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器 ...
- angular学习笔记(十六) -- 过滤器(2)
本篇主要介绍angular自定义的过滤器: 直接看例子: <!DOCTYPE html> <html ng-app="MyFilter"> <head ...
- 编译是报error: 'EVNET_COME_TO_FOREGROUND' was not declared in this scope
Compile++ thumb : game_shared <= main.cpp jni/hellocpp/main.cpp: In function 'void Java_org_coco ...