RabbitMQ ❤ RabbitMQ五种模式

上一章RabbitMq (一)理论篇部分,通过画图的的方式,我觉得比较易懂的方式,介绍了一下整体,本章是用代码实现几个模式。安装的部分,大家自行百度,傻瓜式安装。回头我也会把需要的安装包上传。下载不到的朋友直接拿也是可以。

代码git链接


前言

这还有什么前言啊,没有,直接开干!


准备工作

安装

找到一个安装步骤,没几步,大佬们自行安装吧。
在这里插入图片描述

启动登录

安装好,启动,关闭防火墙拿到ip加上端口15672就可以访问UI界面了。

账号密码都是guest

创建虚拟机

我创建的虚拟机是antry_vm
在这里插入图片描述

创建用户

我创建的用户是antry
注意tags填administrator

这里的tags,定义权限用,具体的看链接,目前也可以不用知道。用户权限
在这里插入图片描述

配置用户给虚拟机

我在antry_vm给antry设置权限
在这里插入图片描述
准备工作完成,撸代码了。
创建一个maven工程,引入包

<dependency>
      <groupId>com.rabbitmq</groupId>
      <artifactId>amqp-client</artifactId>
      <version>5.3.0</version>
    </dependency>

   
   
  • 1
  • 2
  • 3
  • 4
  • 5

准备一个连接工具类,和常量定义

这个不能用注释了吧,参数名称这么人性化,和我前面创建的虚拟机,用户名一一对上就好了。改成大佬你自己的参数就行了。

/**
 * 连接工具
 */
public class RabbitUtils {
    private static ConnectionFactory connectionFactory = new ConnectionFactory();
    static {
        connectionFactory.setHost("192.168.200.131");
        connectionFactory.setPort(5672);//5672是RabbitMQ的默认端口号
        connectionFactory.setUsername("antry");
        connectionFactory.setPassword("antry");
        connectionFactory.setVirtualHost("antry_vm");
    }
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = connectionFactory.newConnection();
            return conn;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

定义一些一会儿会用到的常量,目的呢,有时候多处用到,如果不小心打错了一点,就会出问题,所以定义成常量,容错率高点,编辑器能提示。

/**
 * 参数参量
 */
public class RabbitConstant {
    public static final String QUEUE_HELLOWORLD = "helloword";
    public static final String QUEUE_SMS = "sms";
    public static final String EXCHANGE_WEATHER = "weather";
    public static final String EXCHANGE_WEATHER_ROUTING = "weather_routing";
    public static final String QUEUE_BAIDU = "baidu";
    public static final String QUEUE_SINA = "sina";
    public static final String EXCHANGE_WEATHER_TOPIC = "weather_topic";
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

简单模式

生产者

生产者获取连接-创建通道-声明队列-发送消息

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
    <span class="token comment">//获取TCP长连接</span>
    Connection conn <span class="token operator">=</span> RabbitUtils<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//创建通信“通道”,相当于TCP中的虚拟连接</span>
    Channel channel <span class="token operator">=</span> conn<span class="token punctuation">.</span><span class="token function">createChannel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">//创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列</span>
    <span class="token comment">//第一个参数:队列名称ID</span>
    <span class="token comment">//第二个参数:是否持久化,false对应不持久化数据,MQ停掉数据就会丢失</span>
    <span class="token comment">//第三个参数:是否队列私有化,false则代表所有消费者都可以访问,true代表只有第一次拥有它的消费者才能一直使用,其他消费者不让访问</span>
    <span class="token comment">//第四个:是否自动删除,false代表连接停掉后不自动删除掉这个队列</span>
    <span class="token comment">//其他额外的参数, null</span>
    channel<span class="token punctuation">.</span><span class="token function">queueDeclare</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_HELLOWORLD</span><span class="token punctuation">,</span><span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    String message <span class="token operator">=</span> <span class="token string">"antry"</span><span class="token punctuation">;</span>
    <span class="token comment">//四个参数</span>
    <span class="token comment">//exchange 交换机,暂时用不到,在后面进行发布订阅时才会用到</span>
    <span class="token comment">//队列名称</span>
    <span class="token comment">//额外的设置属性</span>
    <span class="token comment">//最后一个参数是要传递的消息字节数组</span>
    channel<span class="token punctuation">.</span><span class="token function">basicPublish</span><span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_HELLOWORLD</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span>message<span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    conn<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"===发送成功==="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

可以跑起来瞧瞧了
在这里插入图片描述

显示发送成功
此时通过antry用户登录,查看队列,就可以看到创建了一个helloword的队列,不好意思,单词写错,将就吧。
这里有一条消息,未被读取。
在这里插入图片描述

消费者

同样是获取连接,创建通道(其实也可以不用创建了,因为Producer已经创建过了,存在不会再创建,所以问题不大),创建队列,创建消费者,消费者的最后一个参数是实现Customer借口的实现类,我们可以选择实现这个接口,也可以用适配器DefaultCustomer。本次案例使用的是适配器,适配器自动挡用起来爽。这里面手动编辑监听到消息要做什么。

public class Customer {
    public static void main(String[] args) throws IOException {
//获取TCP长连接
        Connection conn = RabbitUtils.getConnection();
        //创建通信“通道”,相当于TCP中的虚拟连接
        Channel channel = conn.createChannel();
    <span class="token comment">//创建队列,声明并创建一个队列,如果队列已存在,则使用这个队列</span>
    <span class="token comment">//第一个参数:队列名称ID</span>
    <span class="token comment">//第二个参数:是否持久化,false对应不持久化数据,MQ停掉数据就会丢失</span>
    <span class="token comment">//第三个参数:是否队列私有化,false则代表所有消费者都可以访问,true代表只有第一次拥有它的消费者才能一直使用,其他消费者不让访问</span>
    <span class="token comment">//第四个:是否自动删除,false代表连接停掉后不自动删除掉这个队列</span>
    <span class="token comment">//其他额外的参数, null</span>
    channel<span class="token punctuation">.</span><span class="token function">queueDeclare</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_HELLOWORLD</span><span class="token punctuation">,</span><span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">//从MQ服务器中获取数据</span>

    <span class="token comment">//创建一个消息消费者</span>
    <span class="token comment">//第一个参数:队列名</span>
    <span class="token comment">//第二个参数代表是否自动确认收到消息,false代表手动编程来确认消息,这是MQ的推荐做法</span>
    <span class="token comment">//第三个参数要传入DefaultConsumer的实现类</span>
    channel<span class="token punctuation">.</span><span class="token function">basicConsume</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_HELLOWORLD</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">Reciver</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">Reciver</span> <span class="token keyword">extends</span> <span class="token class-name">DefaultConsumer</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">private</span> Channel channel<span class="token punctuation">;</span>
    <span class="token comment">//重写构造函数,Channel通道对象需要从外层传入,在handleDelivery中要用到</span>
    <span class="token keyword">public</span> <span class="token function">Reciver</span><span class="token punctuation">(</span><span class="token parameter">Channel channel</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">super</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>channel <span class="token operator">=</span> channel<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    @Override
    <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleDelivery</span><span class="token punctuation">(</span>String s<span class="token punctuation">,</span> Envelope envelope<span class="token punctuation">,</span> <span class="token constant">AMQP</span><span class="token punctuation">.</span>BasicProperties basicProperties<span class="token punctuation">,</span> byte<span class="token punctuation">[</span><span class="token punctuation">]</span> body<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
        String message <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">;</span>
        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消费者接收到的消息:"</span><span class="token operator">+</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span>

        System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消息的TagId:"</span><span class="token operator">+</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">//false只确认签收当前的消息,设置为true的时候则代表签收该消费者所有未签收的消息</span>
        channel<span class="token punctuation">.</span><span class="token function">basicAck</span><span class="token punctuation">(</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

在这里插入图片描述
消费完了之后我们在ui界面上也可以看到空空如也,都被消费了。
在这里插入图片描述

WorkQueue

这个模式是多个消费者一起消费同一个队列中的任务。因此我假设有一个要发100条信息的任务,有三个消费者都能发信息。

信息类


public class SMS {
    /**
     * 接收人姓名
     */
    private String name;
    /**
     * 接收人电话
     */
    private String mobile;
    /**
     * 短信内容
     */
    private String content;
<span class="token keyword">public</span> <span class="token constant">SMS</span><span class="token punctuation">(</span><span class="token parameter">String name<span class="token punctuation">,</span> String mobile<span class="token punctuation">,</span> String content</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>mobile <span class="token operator">=</span> mobile<span class="token punctuation">;</span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>content <span class="token operator">=</span> content<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> String <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">return</span> name<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span><span class="token parameter">String name</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> String <span class="token function">getMobile</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">return</span> mobile<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setMobile</span><span class="token punctuation">(</span><span class="token parameter">String mobile</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>mobile <span class="token operator">=</span> mobile<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> String <span class="token function">getContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">return</span> content<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setContent</span><span class="token punctuation">(</span><span class="token parameter">String content</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    <span class="token keyword">this</span><span class="token punctuation">.</span>content <span class="token operator">=</span> content<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

生产者

因为这里发送对象,需要json转换,所以引入了一个包

   <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.8.5</version>
    </dependency>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

生产者向MQ发送100条任务

public class OrderSystem {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(RabbitConstant.QUEUE_SMS, false, false, false, null);
    <span class="token keyword">for</span><span class="token punctuation">(</span>int i <span class="token operator">=</span> <span class="token number">1</span> <span class="token punctuation">;</span> i <span class="token operator">&lt;=</span> <span class="token number">100</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token constant">SMS</span> sms <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SMS</span><span class="token punctuation">(</span><span class="token string">"乘客"</span> <span class="token operator">+</span> i<span class="token punctuation">,</span> <span class="token string">"13900000"</span> <span class="token operator">+</span> i<span class="token punctuation">,</span> <span class="token string">"您的车票已预订成功"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        String jsonSMS <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Gson</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toJson</span><span class="token punctuation">(</span>sms<span class="token punctuation">)</span><span class="token punctuation">;</span>
        channel<span class="token punctuation">.</span><span class="token function">basicPublish</span><span class="token punctuation">(</span><span class="token string">""</span> <span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SMS</span> <span class="token punctuation">,</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> jsonSMS<span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"发送数据成功"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    connection<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

消费者

可以创建多个消费者,代码都一样,为了区分,我建了三个,分别为SMSSender1、SMSSender2、SMSSender3

public class SMSSender1 {
    public static void main(String[] args) throws IOException {
        Connection connection = RabbitUtils.getConnection();
        final Channel channel = connection.createChannel();
    channel<span class="token punctuation">.</span><span class="token function">queueDeclare</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SMS</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">//如果不写basicQos(1),则自动MQ会将所有请求平均发送给所有消费者</span>
    <span class="token comment">//basicQos,MQ不再对消费者一次发送多个请求,而是消费者处理完一个消息后(确认后),在从队列中获取一个新的</span>
    channel<span class="token punctuation">.</span><span class="token function">basicQos</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//处理完一个取一个</span>

    channel<span class="token punctuation">.</span><span class="token function">basicConsume</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SMS</span> <span class="token punctuation">,</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">DefaultConsumer</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        @Override
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleDelivery</span><span class="token punctuation">(</span>String consumerTag<span class="token punctuation">,</span> Envelope envelope<span class="token punctuation">,</span> <span class="token constant">AMQP</span><span class="token punctuation">.</span>BasicProperties properties<span class="token punctuation">,</span> byte<span class="token punctuation">[</span><span class="token punctuation">]</span> body<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            String jsonSMS <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"SMSSender1-短信发送成功:"</span> <span class="token operator">+</span> jsonSMS<span class="token punctuation">)</span><span class="token punctuation">;</span>

            <span class="token keyword">try</span> <span class="token punctuation">{<!-- --></span>
                Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span>InterruptedException e<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
                e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
            channel<span class="token punctuation">.</span><span class="token function">basicAck</span><span class="token punctuation">(</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

先启动三个消费者,然后启动生产者。
在这里插入图片描述

发布订阅

生产者

注意这里发送消息的时候,选择了交换机,而不是像前面两种模式直接选择队列。前面两个模式并不是没有选择交换机,只是使用了默认的交换机。

public class WeatherBurean {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitUtils.getConnection();
        String input = new Scanner(System.in).next();
        Channel channel = connection.createChannel();
        //第一个参数交换机名字   其他参数和之前的一样
        channel.basicPublish(RabbitConstant.EXCHANGE_WEATHER,"" , null , input.getBytes());
        channel.close();
        connection.close();
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

既然这里用到了交换机,因此就需要在新增要给交换机。
选择自己的交换机,填上交换机名称,选择fanout(广播)模式
在这里插入图片描述

新浪消费者

public class Sina {
    public static void main(String[] args) throws IOException {
        //获取TCP长连接
        Connection connection = RabbitUtils.getConnection();
        //获取虚拟连接
        final Channel channel = connection.createChannel();
        //声明队列信息
        channel.queueDeclare(RabbitConstant.QUEUE_SINA, false, false, false, null);
    <span class="token comment">//queueBind用于将队列与交换机绑定</span>
    <span class="token comment">//参数1:队列名 参数2:交互机名  参数三:路由key(暂时用不到)</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">basicQos</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">basicConsume</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span> <span class="token punctuation">,</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">DefaultConsumer</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        @Override
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleDelivery</span><span class="token punctuation">(</span>String consumerTag<span class="token punctuation">,</span> Envelope envelope<span class="token punctuation">,</span> <span class="token constant">AMQP</span><span class="token punctuation">.</span>BasicProperties properties<span class="token punctuation">,</span> byte<span class="token punctuation">[</span><span class="token punctuation">]</span> body<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"新浪天气收到气象信息:"</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            channel<span class="token punctuation">.</span><span class="token function">basicAck</span><span class="token punctuation">(</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

百度消费者

public class BaiDu {
    public static void main(String[] args) throws IOException {
        //获取TCP长连接
        Connection connection = RabbitUtils.getConnection();
        //获取虚拟连接
        final Channel channel = connection.createChannel();
        //声明队列信息
        channel.queueDeclare(RabbitConstant.QUEUE_BAIDU, false, false, false, null);
    <span class="token comment">//queueBind用于将队列与交换机绑定</span>
    <span class="token comment">//参数1:队列名 参数2:交互机名  参数三:路由key(暂时用不到)</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_BAIDU</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">basicQos</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">basicConsume</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_BAIDU</span> <span class="token punctuation">,</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">DefaultConsumer</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        @Override
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleDelivery</span><span class="token punctuation">(</span>String consumerTag<span class="token punctuation">,</span> Envelope envelope<span class="token punctuation">,</span> <span class="token constant">AMQP</span><span class="token punctuation">.</span>BasicProperties properties<span class="token punctuation">,</span> byte<span class="token punctuation">[</span><span class="token punctuation">]</span> body<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"百度天气收到气象信息:"</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            channel<span class="token punctuation">.</span><span class="token function">basicAck</span><span class="token punctuation">(</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

这两个消费者,和前面的模式不同之处在于,这里申明完队列之后,将队列和交换机进行绑定,也就是绑定到天气的交换机去获取天气信息

先运行新浪和百度的消费者,然后运行生产者,输入信息123123

可以分别在xinna和baidu看到获取到的信息
在这里插入图片描述

路由模式

生产者

这次发送,不仅有交换机,第二个参数作为routingkey,为什么这里的第二个参数被认为是routingkey呢?

public class WeatherBureau {
    public static void main(String[] args) throws IOException, TimeoutException {
        Map area = new LinkedHashMap<String, String>();
        area.put("china.hunan.changsha.20201127", "中国湖南长沙20201127天气数据");
        area.put("china.hubei.wuhan.20201127", "中国湖北武汉20201127天气数据");
        area.put("china.hunan.zhuzhou.20201127", "中国湖南株洲20201128天气数据");
        area.put("us.cal.lsj.20201127", "美国加州洛杉矶20201127天气数据");
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.hebei.shijiazhuang.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国河北石家庄20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.hubei.wuhan.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国湖北武汉20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.henan.zhengzhou.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国河南郑州20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"us.cal.lsj.20201128"</span><span class="token punctuation">,</span> <span class="token string">"美国加州洛杉矶20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    Connection connection <span class="token operator">=</span> RabbitUtils<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    Channel channel <span class="token operator">=</span> connection<span class="token punctuation">.</span><span class="token function">createChannel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    Iterator<span class="token operator">&lt;</span>Map<span class="token punctuation">.</span>Entry<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> String<span class="token operator">&gt;&gt;</span> itr <span class="token operator">=</span> area<span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">iterator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span> <span class="token punctuation">(</span>itr<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        Map<span class="token punctuation">.</span>Entry<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> String<span class="token operator">&gt;</span> me <span class="token operator">=</span> itr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">//第一个参数交换机名字   第二个参数作为 消息的routing key</span>
        channel<span class="token punctuation">.</span><span class="token function">basicPublish</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_ROUTING</span><span class="token punctuation">,</span>me<span class="token punctuation">.</span><span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> me<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    channel<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    connection<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

因为我们在创建这个交换机的失火,我们选择的是direct定向的类型,就会把这个参数当作routingkey
在这里插入图片描述

百度消费者

这里给百度绑定了两个routingkey,分别是china.hunan.changsha.20201127和china.hebei.shijiazhuang.20201128

public class Baidu {
    public static void main(String[] args) throws IOException {
        Connection connection = RabbitUtils.getConnection();
        final Channel channel = connection.createChannel();
        channel.queueDeclare(RabbitConstant.QUEUE_BAIDU, false, false, false, null);
        //queueBind用于将队列与交换机绑定
        //参数1:队列名 参数2:交互机名  参数三:路由key
        channel.queueBind(RabbitConstant.QUEUE_BAIDU, RabbitConstant.EXCHANGE_WEATHER_ROUTING, "china.hunan.changsha.20201127");
        channel.queueBind(RabbitConstant.QUEUE_BAIDU, RabbitConstant.EXCHANGE_WEATHER_ROUTING, "china.hebei.shijiazhuang.20201128");
        channel.basicQos(1);
        channel.basicConsume(RabbitConstant.QUEUE_BAIDU , false , new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("百度天气收到气象信息:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag() , false);
            }
        });
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

新浪消费者

这里给新浪绑定了四个routingkey

public class Sina {
    public static void main(String[] args) throws IOException {
        //获取TCP长连接
        Connection connection = RabbitUtils.getConnection();
        //获取虚拟连接
        final Channel channel = connection.createChannel();
        //声明队列信息
        channel.queueDeclare(RabbitConstant.QUEUE_SINA, false, false, false, null);
    <span class="token comment">//指定队列与交换机以及routing key之间的关系</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_ROUTING</span><span class="token punctuation">,</span> <span class="token string">"us.cal.lsj.20201127"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_ROUTING</span><span class="token punctuation">,</span> <span class="token string">"china.hubei.wuhan.20201127"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_ROUTING</span><span class="token punctuation">,</span> <span class="token string">"us.cal.lsj.20201128"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_ROUTING</span><span class="token punctuation">,</span> <span class="token string">"china.henan.zhengzhou.20201012"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    channel<span class="token punctuation">.</span><span class="token function">basicQos</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">basicConsume</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span> <span class="token punctuation">,</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">DefaultConsumer</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        @Override
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleDelivery</span><span class="token punctuation">(</span>String consumerTag<span class="token punctuation">,</span> Envelope envelope<span class="token punctuation">,</span> <span class="token constant">AMQP</span><span class="token punctuation">.</span>BasicProperties properties<span class="token punctuation">,</span> byte<span class="token punctuation">[</span><span class="token punctuation">]</span> body<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"新浪天气收到气象信息:"</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            channel<span class="token punctuation">.</span><span class="token function">basicAck</span><span class="token punctuation">(</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

运行之后,可以看到新浪和百度都收到了符合各自routingkey的消息
在这里插入图片描述
在这里插入图片描述

在UI中也可以看到交换机通过routingkey绑定了对应的queue,这里我们也可以看到,key没有绑定的信息,发送给交换机直接就丢失了。也证明了交换机没有存储的功能。
在这里插入图片描述

Topic

生产者

可以看出生产者没有什么变化

public class WeaherBureau {
    public static void main(String[] args) throws IOException, TimeoutException {
        Map area = new LinkedHashMap<String, String>();
        area.put("china.hunan.changsha.20201127", "中国湖南长沙20201127天气数据");
        area.put("china.hubei.wuhan.20201127", "中国湖北武汉20201127天气数据");
        area.put("china.hunan.zhuzhou.20201127", "中国湖南株洲20201127天气数据");
        area.put("us.cal.lsj.20201127", "美国加州洛杉矶20201127天气数据");
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.hebei.shijiazhuang.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国河北石家庄20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.hubei.wuhan.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国湖北武汉20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.henan.zhengzhou.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国河南郑州20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"us.cal.lsj.20201128"</span><span class="token punctuation">,</span> <span class="token string">"美国加州洛杉矶20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


    Connection connection <span class="token operator">=</span> RabbitUtils<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    Channel channel <span class="token operator">=</span> connection<span class="token punctuation">.</span><span class="token function">createChannel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    Iterator<span class="token operator">&lt;</span>Map<span class="token punctuation">.</span>Entry<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> String<span class="token operator">&gt;&gt;</span> itr <span class="token operator">=</span> area<span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">iterator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span> <span class="token punctuation">(</span>itr<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        Map<span class="token punctuation">.</span>Entry<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> String<span class="token operator">&gt;</span> me <span class="token operator">=</span> itr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">//第一个参数交换机名字   第二个参数作为 消息的routing key</span>
        channel<span class="token punctuation">.</span><span class="token function">basicPublish</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_TOPIC</span><span class="token punctuation">,</span>me<span class="token punctuation">.</span><span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> me<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token punctuation">}</span>
    channel<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    connection<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

只是在新建交换机的时候要选择topic类型
在这里插入图片描述

百度消费者

可以看到消费者的变化,只是roukingkey绑定时,用了通配符。

public class Baidu {
    public static void main(String[] args) throws IOException {
        Connection connection = RabbitUtils.getConnection();
        final Channel channel = connection.createChannel();
        channel.queueDeclare(RabbitConstant.QUEUE_BAIDU, false, false, false, null);
        //queueBind用于将队列与交换机绑定
        //参数1:队列名 参数2:交互机名  参数三:路由key
        channel.queueBind(RabbitConstant.QUEUE_BAIDU, RabbitConstant.EXCHANGE_WEATHER_TOPIC, "*.*.*.20201127");
        // channel.queueBind(RabbitConstant.QUEUE_BAIDU, RabbitConstant.EXCHANGE_WEATHER_ROUTING, "china.hebei.shijiazhuang.20201128");
        channel.basicQos(1);
        channel.basicConsume(RabbitConstant.QUEUE_BAIDU , false , new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("百度天气收到气象信息:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag() , false);
            }
        });
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

新浪消费者

public class Sina {
    public static void main(String[] args) throws IOException {
        //获取TCP长连接
        Connection connection = RabbitUtils.getConnection();
        //获取虚拟连接
        final Channel channel = connection.createChannel();
        //声明队列信息
        channel.queueDeclare(RabbitConstant.QUEUE_SINA, false, false, false, null);
    <span class="token comment">//指定队列与交换机以及routing key之间的关系</span>
    channel<span class="token punctuation">.</span><span class="token function">queueBind</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span><span class="token punctuation">,</span> RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_TOPIC</span><span class="token punctuation">,</span> <span class="token string">"us.#"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    channel<span class="token punctuation">.</span><span class="token function">basicQos</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">basicConsume</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">QUEUE_SINA</span> <span class="token punctuation">,</span> <span class="token boolean">false</span> <span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">DefaultConsumer</span><span class="token punctuation">(</span>channel<span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
        @Override
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleDelivery</span><span class="token punctuation">(</span>String consumerTag<span class="token punctuation">,</span> Envelope envelope<span class="token punctuation">,</span> <span class="token constant">AMQP</span><span class="token punctuation">.</span>BasicProperties properties<span class="token punctuation">,</span> byte<span class="token punctuation">[</span><span class="token punctuation">]</span> body<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"新浪天气收到气象信息:"</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>body<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            channel<span class="token punctuation">.</span><span class="token function">basicAck</span><span class="token punctuation">(</span>envelope<span class="token punctuation">.</span><span class="token function">getDeliveryTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行之后可以看到各自都拿到对应匹配的信息
在这里插入图片描述
在这里插入图片描述

Comfirm和Return

生产者

因为我们前面都跑过了消费者,这个地方可以不需要新建消费者。因为Comfirm和Return时发生在Producer和Broker之间的

public class WeatherBureau {
    public static void main(String[] args) throws IOException, TimeoutException {
        Map area = new LinkedHashMap<String, String>();
        area.put("china.hunan.changsha.20201127", "中国湖南长沙20201127天气数据");
        area.put("china.hubei.wuhan.20201127", "中国湖北武汉20201127天气数据");
         area.put("china.hunan.zhuzhou.20201127", "中国湖南株洲20201127天气数据");
        area.put("us.cal.lsj.20201127", "美国加州洛杉矶20201127天气数据");
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.hebei.shijiazhuang.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国河北石家庄20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.hubei.wuhan.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国湖北武汉20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"china.henan.zhengzhou.20201128"</span><span class="token punctuation">,</span> <span class="token string">"中国河南郑州20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    area<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"us.cal.lsj.20201128"</span><span class="token punctuation">,</span> <span class="token string">"美国加州洛杉矶20201128天气数据"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    Connection connection <span class="token operator">=</span> RabbitUtils<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    Channel channel <span class="token operator">=</span> connection<span class="token punctuation">.</span><span class="token function">createChannel</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//开启confirm监听模式</span>
    channel<span class="token punctuation">.</span><span class="token function">confirmSelect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    channel<span class="token punctuation">.</span><span class="token function">addConfirmListener</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ConfirmListener</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleAck</span><span class="token punctuation">(</span>long l<span class="token punctuation">,</span> boolean b<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            <span class="token comment">//第二个参数代表接收的数据是否为批量接收,一般我们用不到。</span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消息已被Broker接收,Tag:"</span> <span class="token operator">+</span> l <span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>

        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handleNack</span><span class="token punctuation">(</span>long l<span class="token punctuation">,</span> boolean b<span class="token punctuation">)</span> throws IOException <span class="token punctuation">{<!-- --></span>
            System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消息已被Broker拒收,Tag:"</span> <span class="token operator">+</span> l<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
   channel<span class="token punctuation">.</span><span class="token function">addReturnListener</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">ReturnCallback</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">handle</span><span class="token punctuation">(</span><span class="token parameter">Return r</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
            System<span class="token punctuation">.</span>err<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"==========================="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>err<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Return编码:"</span> <span class="token operator">+</span> r<span class="token punctuation">.</span><span class="token function">getReplyCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"-Return描述:"</span> <span class="token operator">+</span> r<span class="token punctuation">.</span><span class="token function">getReplyText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>err<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"交换机:"</span> <span class="token operator">+</span> r<span class="token punctuation">.</span><span class="token function">getExchange</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"-路由key:"</span> <span class="token operator">+</span> r<span class="token punctuation">.</span><span class="token function">getRoutingKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>err<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Return主题:"</span> <span class="token operator">+</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>r<span class="token punctuation">.</span><span class="token function">getBody</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            System<span class="token punctuation">.</span>err<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"==========================="</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    Iterator<span class="token operator">&lt;</span>Map<span class="token punctuation">.</span>Entry<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> String<span class="token operator">&gt;&gt;</span> itr <span class="token operator">=</span> area<span class="token punctuation">.</span><span class="token function">entrySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">iterator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">while</span> <span class="token punctuation">(</span>itr<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
        Map<span class="token punctuation">.</span>Entry<span class="token operator">&lt;</span>String<span class="token punctuation">,</span> String<span class="token operator">&gt;</span> me <span class="token operator">=</span> itr<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">//Routing key 第二个参数相当于数据筛选的条件</span>
        <span class="token comment">//第三个参数为:mandatory true代表如果消息无法正常投递则return回生产者,如果false,则直接将消息放弃。</span>
        channel<span class="token punctuation">.</span><span class="token function">basicPublish</span><span class="token punctuation">(</span>RabbitConstant<span class="token punctuation">.</span><span class="token constant">EXCHANGE_WEATHER_TOPIC</span><span class="token punctuation">,</span>me<span class="token punctuation">.</span><span class="token function">getKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token keyword">null</span> <span class="token punctuation">,</span> me<span class="token punctuation">.</span><span class="token function">getValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getBytes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">//如果关闭则无法进行监听,因此此处不需要关闭</span>
    <span class="token comment">/*channel.close();
    connection.close();*/</span>
<span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

先运行一下
在这里插入图片描述
从结果可以看到,这三个被return就是我们前面发现发送出,而丢失不见的三条消息。8条消息都被Broker接收到了,只是有三条找不到对应的队列进行投递,因此进行Return了,可以再创建几个队列来绑定这个几个routingkey,随后就会发现,所有的消息都被接收了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值