准备工作

  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. vue confirm确认

    this.$confirm('您确定删除吗?').then(_ => { do something ... (确认) }).catch(_ => { do something ... (取 ...

  2. OpenVPN 2.2.1 之后期维护

    一.Openvpn 用户注销 每个公司都会用员工离职,因此注销vpn用户也就成了运维人员日常工作的一部分. 其实Openvpn在设计的时候也想到了这点,我们可以使用 revoke-full shell ...

  3. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛----随手记录帖

    这是跟学长学姐组队来打的最爽的一次比赛了,也可能是互相组队最后一次比赛了,南哥和楼学姐,省赛之后就退役了,祝他们能考研和面试都有happy ending! 虽然最后没有把F题的n^2约数的数学题写完, ...

  4. winbox添加dhcp和nat

    例子如上,wan连接外网,lan作为内网. 设置网卡ip 保证mac地址正确! 去到ip address里,设置两网卡的ip! 保证能ping通外网! 设置dhcp ip pool添加池,192.16 ...

  5. linux命令学习之:rm

    rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 注意:使用rm命令要格外小心.因为一旦 ...

  6. MyBatis高级映射查询(3)

    一.数据库数据和项目搭建过程 1.主要要四张表,分别为user用户信息表.items商品表.orderdetail订单明细表.orders订单表.表的结构和数据如下: 表结构 CREATE DATAB ...

  7. 工作中用Git对项目进行管理

    前言 之前一直是用svn来管理代码的,今天第一次用git来管理代码,从安装.上传代码过程中遇到了很多问题,Github中建的repository之前还是https协议,最后不知道怎么又变成了git协议 ...

  8. springboot 日志1

    技术交流群: 816227112 Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J,  ...

  9. 线特征---LineMatching代码运行(五)

    [1]    https://github.com/dlut-dimt/LineMatching The code is based on Matlab.  https://github.com/ka ...

  10. PhotoSphereViewer 全景图

    1网站地址:http://photo-sphere-viewer.js.org/markers.html#demo 2参数中文地址:https://www.cnblogs.com/big-tree/p ...