RabbitMQ java语言demo(二)

RabbitMQ-DEMO

什么是队列(queue)?

消息队列是存储消息的缓冲区。生产者将消息发送到队列中,消费者从队列中接收消息。

//生产者代码
 channel.queueDeclare(QUEUE_NAME, durable, false, false, null);
 String message = String.join(" ", "work3");

  // 标记我们的消息为持久化
  channel.basicPublish("", QUEUE_NAME,
          MessageProperties.PERSISTENT_TEXT_PLAIN,
          message.getBytes("UTF-8"));

//####################  消费者代码 Worker ###########################
boolean durable = true; // 队列持久化
channel.queueDeclare(QUEUE_NAME, durable, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

channel.basicQos(1); // 接收未确认消息的数量限制

DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");

 System.out.println(" [x] Received '" + message + "'");
 try {
     doWork(message);
 } finally {
     System.out.println(" [x] Done");
     channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
 }
 };
 boolean autoAck = false; // 关闭自动确认
 channel.basicConsume(QUEUE_NAME, autoAck, deliverCallback, consumerTag -> { });

什么是交换机exchange?

交换器是消息路由的组件。生产者将消息发送到交换器,而不是直接发送到队列。交换器根据路由键(Routing Key)将消息路由到一个或多个队列。有以下类型(direct(直连), topic, headers and fanout)

//扇出 所有绑定logs路由info得队列都会收到消息
channel.exchangeDeclare("logs", "fanout");
String routingKey = "info";
String message = getMessage(argv);
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));

//###################   消费者 #######################
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//会生产临时的队列 amq.gen-JzTY20BRgKO-HjmUJj0wLg
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "info");
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + delivery.getEnvelope().getRoutingKey() + "':'" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });

什么是主题(topics)?

发送到主题交换的消息不能有任意的routing_key,它必须是由句点分隔的单词列表。单词可以是任何东西,但通常它们指定与消息相关的一些功能。一些有效的路由关键字示例:“stock.usd.nyse”、“nyse.vmw”、“quickOrange.rabbbit”。路由密钥中可以有任意多个单词,最多255个字节。
绑定密钥也必须采用相同的形式。主题交换背后的逻辑类似于直接逻辑-使用特定路由密钥发送的消息将被传递到使用匹配绑定密钥绑定的所有队列。但是,绑定密钥有两种重要的特殊情况:
*(星)正好可以代替一个词。
#(hash)可以代替零个或多个单词。
在一个例子中解释这一点最简单:

 Runnable runnable = () ->{
            String[] agrs = new String[]{"#.kern.critical" , "A critical kernel error"};
            new EmitLogTopics(agrs);
        };

        Runnable runnable1 = () ->{
            String[] agrs = new String[]{"kern.*","kern ******"};
            new EmitLogTopics(agrs);
        };

        Runnable runnable2 = () ->{
            String[] agrs = new String[]{"*.critical","a critical * message"};
            new EmitLogTopics(agrs);
        };

        Runnable runnable3 = () ->{
            String[] agrs = new String[]{"kern.*","*.critical ***"};
            new EmitLogTopics(agrs);
        };

// ##################  消费端 ##################
 Runnable runnable = () ->{
            String[] args = new String[]{"#","kern.*","*.critical","kern.*","*.critical"};
            new ReceiveLogsTopics(args);
        };


demo示例
在这里插入图片描述

添加微信,_ 回复 “rabbitMQDemo” 即可
在这里插入图片描述

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值