RabbitMQ之路由 topic方式

来源:互联网 发布:js获取input选中的值 编辑:程序博客网 时间:2024/06/08 17:37

maven和工具类:http://blog.csdn.net/u014803081/article/details/73850657

生产者

import com.rabbitmq.client.BuiltinExchangeType;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.ydh.util.ConnectionFactoryUtil;import java.util.UUID;/** * *可以匹配一个标识符。 * #可以匹配0个或多个标识符。 */public class TopicPorducer {    private static final String EXCHANGE_NAME = "ex_topic";    public static void main(String[] args) throws Exception {        // 创建一个频道        Connection conn = ConnectionFactoryUtil.getInstance();        Channel channel = conn.createChannel();        // 声明转发器        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);        // 定义绑定键        String[] routing_keys = new String[] { "kernal.info", "cron.warning", "auth.info", "kernel.critical" };        for (String routing_key : routing_keys) {            // 发送4条不同绑定键的消息            String msg = UUID.randomUUID().toString();            channel.basicPublish(EXCHANGE_NAME, routing_key, null, msg.getBytes());            System.out.println(" [x] Sent routingKey = " + routing_key + " ,msg = " + msg + ".");        }        channel.close();        conn.close();    }}

critical消费者

import com.rabbitmq.client.*;import com.ydh.util.ConnectionFactoryUtil;import java.io.IOException;//接收*.critical消息  public class TopicConsumerCritical {    private static final String EXCHANGE_NAME = "ex_topic";    public static void main(String[] args) throws Exception {        // 创建一个频道        Connection conn = ConnectionFactoryUtil.getInstance();        Channel channel = conn.createChannel();        // 声明转发器        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);        // 随机生成一个队列        String queueName = channel.queueDeclare().getQueue();        // 接收所有与kernel相关的消息        channel.queueBind(queueName, EXCHANGE_NAME, "*.critical");        System.out.println(" [*] Waiting for critical messages. To exit press CTRL+C");        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");                String routingKey = envelope.getRoutingKey();                System.out.println(" [x] Received routingKey = " + routingKey + ",msg = " + message + ".");            }        };        channel.basicConsume(queueName, true, consumer);    }}

kernel消费者

import com.rabbitmq.client.*;import com.ydh.util.ConnectionFactoryUtil;import java.io.IOException;//接收kernel.*消息  public class TopicConsumerKernel {    private static final String EXCHANGE_NAME = "ex_topic";    public static void main(String[] args) throws Exception {        // 创建一个频道        Connection conn = ConnectionFactoryUtil.getInstance();        Channel channel = conn.createChannel();        // 声明转发器        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);        // 随机生成一个队列        String queueName = channel.queueDeclare().getQueue();        // 接收所有与kernel相关的消息        channel.queueBind(queueName, EXCHANGE_NAME, "kernel.*");        System.out.println(" [*] Waiting for messages about kernel. To exit press CTRL+C");        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");                String routingKey = envelope.getRoutingKey();                System.out.println(" [x] Received routingKey = " + routingKey + ",msg = " + message + ".");            }        };        channel.basicConsume(queueName, true, consumer);    }}

启动2个消费者,再启动发送4类消息生产者。观察接收到的消息,都收到对应的消息。可以看出使用topic类型的转发器,成功实现了多重条件选择的订阅。

原创粉丝点击