准备工作

  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的更多相关文章

  1. rabbitMQ第二篇:java简单的实现RabbitMQ

    前言:在这里我将用java来简单的实现rabbitMQ.下面我们带着下面问题来一步步的了解和学习rabbitMQ. 1:如果消费者连接中断,这期间我们应该怎么办 2:如何做到负载均衡 3:如何有效的将 ...

  2. rabbitmq的java简单的实现

    1,安装rabbitmq.我的是ubuntu14.04,在官网上面下载最新的安装文件http://www.rabbitmq.com/install-debian.html 2.安装完之后  启动rab ...

  3. java操作rabbitmq实现简单的消息发送(socket编程的升级)

    准备: 1.下载rabbitmq并搭建环境(和python那篇一样:http://www.cnblogs.com/g177w/p/8176797.html) 2.下载支持的jar包(http://re ...

  4. 一个简单的java程序,用于RabbitMQ日志监控

    RabbitMQ的所有日志,都会发给topic类型的exchange “amq.rabbitmq.log”  routingKey 有 debug,info,waring,error.  如果接收所有 ...

  5. RabbitMQ的使用(五)RabbitMQ Java Client简单生产者、消费者代码示例

    pom文件: <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artif ...

  6. RABBITMQ/JAVA (主题)

    上篇博文中,我们进一步改良了日志系统.即使用Direct类型的转换器,使得接受者有能力进行选择性的接收日志,而非fanout那样,只能够无脑的转发. 虽然使用Direct类型的转换器改进了日志系统.但 ...

  7. RabbitMQ/JAVA (路由选择)

    上篇博文中,我们建立了一个简单的日志系统.可以广播消息给多个消费者.本篇博文,我们将添加新的特性--我们可以只订阅部分消息.比如:我们可以接收Error级别的消息写入文件.同时仍然可以在控制台打印所有 ...

  8. RabbitMQ/JAVA 客户端测试(补:利用线程)

    上次进行了简单的连接测试.这次主要进行一下小小的补充.利用线程将生产者消费者代码合到一个文件中. 我是将Recv.java(消费者)文件放在一个线程里添加到Send.java(生产者)中. 代码如下: ...

  9. RabbitMQ/JAVA 客户端连接测试

    这里是一个简单的helloworld测试. 这里在eclipse平台中实现 细节不再赘述.重点是导入rabbitmq-java-client的jar包 下载地址:http://www.rabbitmq ...

随机推荐

  1. dbcp第一次获取连接的时间问题

    最近优化代码,发现第一次调用数据库连接时非常慢,往后便不再发生.经了解,数据库连接是用dbcp管理的,想在网上查找答案,但没有找到.在某人的提醒下决定研究源代码: 部分源代码如下(BasicDataS ...

  2. PHP伪原创同义词替代代码示意

    PHP伪原创同义词替代代码示意很多网站后台都是支持PHP,虽然用同义词百度能够识别,但至少比原封不动好些,没有AI原创NLP原创度高,但也有一定的效果.下面就是PHP代码实例: <?phpreq ...

  3. layer数据表格换行

    在使用layer数据表格的时候,默认是不可以换行的.这样显示 改动后 数据格式为   aa<br>bb就会显示为换行 比如我们的字符串是    a<br>b 这样的字符串浏览器 ...

  4. AVL树与红黑树(R-B树)的区别与联系

    AVL树(http://baike.baidu.com/view/593144.htm?fr=aladdin),又称(严格)高度平衡的二叉搜索树.其他的平衡树还有:红黑树.Treap.伸展树.SBT. ...

  5. white-space和word-wrap和word-break所表示的换行和不换行的区别

    一.前言 使得文本换行有很多方式, <br/>标签元素,能够强制使得所在位置文本换行 <p>元素,<div>设定宽度,都可以对文本内容实现自适应换行 对于长单词或者 ...

  6. Codeforces Beta Round #59 (Div. 2)

    Codeforces Beta Round #59 (Div. 2) http://codeforces.com/contest/63 A #include<bits/stdc++.h> ...

  7. 微信小程序开发——开发者工具无法输入中文的处理

    问题模块 框架类型 问题类型 操作系统 工具版本 开发者工具 小程序 Bug Windows v.02.1810290 异常描述: 无法输入中文,偶现,但是概率有点高,重启,重装,更新版本等等都未解决 ...

  8. JS参数转发

    在没有装饰器之前不方便. 可以用Reflect.apply. cls = function f() { let obj = {}; obj.show = function(a, b) { consol ...

  9. 26【python】sprintf风格的字符串

    参考资料:https://docs.python.org/3.5/library/stdtypes.html#old-string-formatting 实例 s#!/bin/python a = ( ...

  10. 使用mybatis-generator-core工具自动生成mybatis实体

    我们可以使用mybatis-generator-core这个工具将数据库对象转换成mybatis对象,具体步骤如下. 1.mybatis-generator-core下载 下载地址:http://do ...