【RabbitMQ】 Java简单的实现RabbitMQ
准备工作
1、安装RabbitMQ,参考【RabbitMQ】 RabbitMQ安装
2、新建Java项目,引入RabbitMQ的Maven依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.5.0</version>
</dependency>
单生产者消费者
流程图:

1、创建生产者Producer1
public class Producer1 {
private final static String QUEUE_NAME = "rabbitMQ.test.queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ相关信息
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 声明一个队列
// queueDeclare(队列名称,是否持久化(true表示是,队列将在服务器重启时生存),是否是独占队列(创建者可以使用的私有队列,断开后自动删除),
// 当所有消费者客户端连接断开时是否自动删除队列,队列的其他参数)
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello RabbitMQ ~";
// 发送消息到队列中
// basicPublish(交换机名称,队列映射的路由key,消息的其他属性,发送信息的主体)
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println("Producer Send +'" + message + "'");
// 关闭通道和连接
channel.close();
connection.close();
}
}
2、创建消费者Customer1
public class Customer1 {
private final static String QUEUE_NAME = "rabbitMQ.test.queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ地址
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个通道
final Channel channel = connection.createChannel();
// 声明要关注的队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);//保证一次只分发一个
System.out.println("Customer Waiting Received messages");
// DefaultConsumer类实现了Consumer接口,通过传入一个频道,
// 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println("Customer Received '" + message + "'");
}
};
// 自动回复队列应答 -- RabbitMQ中的消息确认机制
channel.basicConsume(QUEUE_NAME, true, consumer);
}
}
3、运行结果
a、生产者

b、消费者

推送确认和消费应答
流程图

1、创建推送确认生产者Producer2
public class Producer2 {
private final static String QUEUE_NAME = "rabbitMQ.test.queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ相关信息
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个通道
Channel channel = connection.createChannel();
// 声明一个队列
// queueDeclare(队列名称,是否持久化(true表示是,队列将在服务器重启时生存),是否是独占队列(创建者可以使用的私有队列,断开后自动删除),
// 当所有消费者客户端连接断开时是否自动删除队列,队列的其他参数)
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
// 开启发送方确认模式
channel.confirmSelect();
// 存储未确认的消息标识tag
final SortedSet<Long> confirmSet = Collections.synchronizedNavigableSet(new TreeSet<Long>());
// 异步监听确认和未确认的消息
channel.addConfirmListener(new ConfirmListener() {
/**
* 处理返回确认成功
*
* @param deliveryTag 如果是多条,这个就是最后一条消息的tag
* @param multiple 是否多条
* @throws IOException
*/
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
System.out.println("消息发送成功, deliveryTag:" + deliveryTag + " multiple:" + multiple + "");
if (multiple) {
// 移除发送成功的多条消息标识tag
confirmSet.headSet(deliveryTag + 1).clear();
} else {
// 移除发送成功的一条消息标识tag
confirmSet.remove(deliveryTag);
}
}
/**
* 处理返回确认失败
*
* @param deliveryTag 如果是多条,这个就是最后一条消息的tag
* @param multiple 是否多条
* @throws IOException
*/
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
System.out.println("失败,deliveryTag:" + deliveryTag + "multiple:" + multiple + "");
if (multiple) {
confirmSet.headSet(deliveryTag + 1).clear();
} else {
confirmSet.remove(deliveryTag);
}
}
});
String message = "Hello RabbitMQ ~ ";
// 发送消息到队列中
// basicPublish(交换机名称,队列映射的路由key,消息的其他属性,发送信息的主体)
for (int i = 1; i <= 10; i++) {
String msg = message + i;
long tag = channel.getNextPublishSeqNo();
confirmSet.add(tag);
System.out.println("tag:" + tag);
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes("UTF-8"));
System.out.println("Producer Send +'" + msg + "'");
}
System.out.println("============================");
// 关闭通道和连接
// channel.close();
// connection.close();
}
}
2、创建消费应答消费者Customer2
public class Customer2 {
private final static String QUEUE_NAME = "rabbitMQ.test.queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ地址
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个通道
final Channel channel = connection.createChannel();
// 声明要关注的队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);// 保证一次只分发一个
System.out.println("Customer Waiting Received messages");
// DefaultConsumer类实现了Consumer接口,通过传入一个频道,
// 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println("Customer Received '" + message + "'");
// 返回消费确认状态
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
// 消费手动确认 -- RabbitMQ中的消息确认机制
channel.basicConsume(QUEUE_NAME, false, consumer);
}
}
3、运行结果
生产者:

消费者:

多消费者
流程图

1、创建推送确认生产者Producer3(与示例Producer2一样)
2、创建消费应答消费者Customer3
public class Customer3 {
private final static String QUEUE_NAME = "rabbitMQ.test.queue";
public static void main(String[] args) throws IOException, TimeoutException {
Customer3 customer3 = new Customer3();
customer3.createCustomer("customer1");
customer3.createCustomer("customer2");
}
public void createCustomer(final String customerName) throws IOException, TimeoutException{
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置RabbitMQ地址
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
factory.setPort(5672);
// 创建一个新的连接
Connection connection = factory.newConnection();
// 创建一个通道
final Channel channel = connection.createChannel();
// 声明要关注的队列
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicQos(1);// 保证一次只分发一个
System.out.println(customerName + " Waiting Received messages");
// DefaultConsumer类实现了Consumer接口,通过传入一个频道,
// 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(customerName + " Received '" + message + "'");
// doWork处理任务
doWork(customerName);
// 返回消费确认状态
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
// 消费手动确认 -- RabbitMQ中的消息确认机制
channel.basicConsume(QUEUE_NAME, false, consumer);
}
private void doWork(String customer) {
try {
Thread.sleep(2000); // 暂停2秒钟
System.out.println(customer + ": completion of the job!");
} catch (InterruptedException _ignored) {
Thread.currentThread().interrupt();
}
}
}
3、运行结果
生产者与前面相同
消费者

【RabbitMQ】 Java简单的实现RabbitMQ的更多相关文章
- rabbitMQ第二篇:java简单的实现RabbitMQ
前言:在这里我将用java来简单的实现rabbitMQ.下面我们带着下面问题来一步步的了解和学习rabbitMQ. 1:如果消费者连接中断,这期间我们应该怎么办 2:如何做到负载均衡 3:如何有效的将 ...
- rabbitmq的java简单的实现
1,安装rabbitmq.我的是ubuntu14.04,在官网上面下载最新的安装文件http://www.rabbitmq.com/install-debian.html 2.安装完之后 启动rab ...
- java操作rabbitmq实现简单的消息发送(socket编程的升级)
准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...
- 一个简单的java程序,用于RabbitMQ日志监控
RabbitMQ的所有日志,都会发给topic类型的exchange “amq.rabbitmq.log” routingKey 有 debug,info,waring,error. 如果接收所有 ...
- RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例
pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...
- RABBITMQ/JAVA (主题)
上篇博文中,我们进一步改良了日志系统.即使用Direct类型的转换器,使得接受者有能力进行选择性的接收日志,而非fanout那样,只能够无脑的转发. 虽然使用Direct类型的转换器改进了日志系统.但 ...
- RabbitMQ/JAVA (路由选择)
上篇博文中,我们建立了一个简单的日志系统.可以广播消息给多个消费者.本篇博文,我们将添加新的特性--我们可以只订阅部分消息.比如:我们可以接收Error级别的消息写入文件.同时仍然可以在控制台打印所有 ...
- RabbitMQ/JAVA 客户端测试(补:利用线程)
上次进行了简单的连接测试.这次主要进行一下小小的补充.利用线程将生产者消费者代码合到一个文件中. 我是将Recv.java(消费者)文件放在一个线程里添加到Send.java(生产者)中. 代码如下: ...
- RabbitMQ/JAVA 客户端连接测试
这里是一个简单的helloworld测试. 这里在eclipse平台中实现 细节不再赘述.重点是导入rabbitmq-java-client的jar包 下载地址:http://www.rabbitmq ...
随机推荐
- vue confirm确认
this.$confirm('您确定删除吗?').then(_ => { do something ... (确认) }).catch(_ => { do something ... (取 ...
- OpenVPN 2.2.1 之后期维护
一.Openvpn 用户注销 每个公司都会用员工离职,因此注销vpn用户也就成了运维人员日常工作的一部分. 其实Openvpn在设计的时候也想到了这点,我们可以使用 revoke-full shell ...
- 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛----随手记录帖
这是跟学长学姐组队来打的最爽的一次比赛了,也可能是互相组队最后一次比赛了,南哥和楼学姐,省赛之后就退役了,祝他们能考研和面试都有happy ending! 虽然最后没有把F题的n^2约数的数学题写完, ...
- winbox添加dhcp和nat
例子如上,wan连接外网,lan作为内网. 设置网卡ip 保证mac地址正确! 去到ip address里,设置两网卡的ip! 保证能ping通外网! 设置dhcp ip pool添加池,192.16 ...
- linux命令学习之:rm
rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 注意:使用rm命令要格外小心.因为一旦 ...
- MyBatis高级映射查询(3)
一.数据库数据和项目搭建过程 1.主要要四张表,分别为user用户信息表.items商品表.orderdetail订单明细表.orders订单表.表的结构和数据如下: 表结构 CREATE DATAB ...
- 工作中用Git对项目进行管理
前言 之前一直是用svn来管理代码的,今天第一次用git来管理代码,从安装.上传代码过程中遇到了很多问题,Github中建的repository之前还是https协议,最后不知道怎么又变成了git协议 ...
- springboot 日志1
技术交流群: 816227112 Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, ...
- 线特征---LineMatching代码运行(五)
[1] https://github.com/dlut-dimt/LineMatching The code is based on Matlab. https://github.com/ka ...
- PhotoSphereViewer 全景图
1网站地址:http://photo-sphere-viewer.js.org/markers.html#demo 2参数中文地址:https://www.cnblogs.com/big-tree/p ...