rabbitmq主題訂閱

rabbitmq主題訂閱

一、topic 模式交換機

上一篇文章講述了關於直接連接交換機根據key找到對應隊列的方式,實現特殊消息特殊隊列消費的目的,但是事實上,生產環境下,對於消息的複雜性遠不是這樣就能夠解決的!比如:你要監控有個用戶的操作行爲,用戶的操作行爲太多了 增刪改查,如果一個一個的寫難免會有遺漏,這個時候,我們可以用通配符 user.* 輕鬆解決!這就是mq的主題模式

這裏的交換機類型爲 topic 模式的,他更像direct模式,只不過direct是單個匹配,而topic是通配符匹配

  • *:代表一個字符
  • #:代表多個字符

他的用法極其類似於direct 模式,我們不多說了,直接看代碼

二、主要代碼

消息生產者:消息生產者,在發送消息的時候需要指定消息類型

String msg = "醉臥沙場君莫笑";
//關注第二個參數
channel.basicPublish(EXCHANGE_NAME,"huangfu.del",null,msg.getBytes());

消息消費者消息消費者,在綁定交換機的時候需要指定通配符

//綁定交換機
channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"huangfu.#");

三、詳細代碼

消息生產者

package com.topics;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.util.MqConnection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 發佈訂閱模式
 * 主題模式
 * @author huangfu
 */
public class TopicsSend {
    private static String EXCHANGE_NAME = "topic";
    public static void main(String[] args) throws IOException, TimeoutException {

        Connection connection = MqConnection.getConnection();
        Channel channel = connection.createChannel();

        channel.exchangeDeclare(EXCHANGE_NAME,"topic");

        String msg = "醉臥沙場君莫笑";
        channel.basicPublish(EXCHANGE_NAME,"huangfu.del",null,msg.getBytes());
        System.out.println("send:"+msg);
        channel.close();
        connection.close();
    }
}

消費者1

package com.topics;

import com.rabbitmq.client.*;
import com.util.MqConnection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author Administrator
 */
public class TopicsRecv {
    private static String QUEUE_NAME = "topics";
    private static String EXCHANGE_NAME = "topic";
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = MqConnection.getConnection();
        final Channel channel = connection.createChannel();

        //聲明對壘
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);

        //綁定交換機
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"huangfu.add");

        channel.basicQos(1);

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println(new String(body,"UTF-8"));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

消費者2

package com.topics;

import com.rabbitmq.client.*;
import com.util.MqConnection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author Administrator
 */
public class TopicsRecv2 {
    private static String QUEUE_NAME = "topics2";
    private static String EXCHANGE_NAME = "topic";
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = MqConnection.getConnection();
        final Channel channel = connection.createChannel();

        //聲明對壘
        channel.queueDeclare(QUEUE_NAME,false,false,false,null);

        //綁定交換機
        channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,"huangfu.#");

        channel.basicQos(1);

        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println(new String(body,"UTF-8"));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };

        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章