Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / RabbitMQ - About ExchangeTypes 总结

总结一下几种ExchangeTypes。之前写发布/订阅模式时第一次提到了exchange type(见 http://www.linuxidc.com/Linux/2014-08/105107.htm)。即producer不是将消息直接放到队列中,而是先到exchange中,exchange主要用于控制消息到队列的路由,根据具体的exchange type将消息传给需要的队列或者直接废弃。在这一篇中总结一下那些用到的exchange type。一.Direct Exchangedirect exchange算是最基本的了。direct exchange用于将带上routing key的消息传值拥有相同routing key的队列中。当我们想用一个简单的标识符区别所有传入同一个exchange中的消息时direct exchange就非常合适。代码如下:
private static String DIRECT_EXCHANGE = "DIRECT_EXCHAGNE";     static class FanoutProducer {        public static void main(String[] args) throws IOException {            ConnectionFactory connectionFactory = new ConnectionFactory();            Connection connection = connectionFactory.newConnection();            Channel channel= connection.createChannel();;             String content = "I miss the conversation";            channel.exchangeDeclare(DIRECT_EXCHANGE, ExchangeTypes.DIRECT);            channel.basicPublish(DIRECT_EXCHANGE, "alvez", null, content.getBytes());        }    }     static class FanoutConsumer {        public static void main(String[] args) throws IOException, InterruptedException {            ConnectionFactory connectionFactory = new ConnectionFactory();            Connection connection = connectionFactory.newConnection();            Channel channel= connection.createChannel();             String queueName = channel.queueDeclare().getQueue();            channel.queueBind(queueName, DIRECT_EXCHANGE, "alvez");             QueueingConsumer consumer = new QueueingConsumer(channel);            String s = channel.basicConsume(queueName, true, consumer);            System.out.println(s);            while (true) {                QueueingConsumer.Delivery delivery = consumer.nextDelivery();                String message = new String(delivery.getBody());                String routingKey = delivery.getEnvelope().getRoutingKey();                 System.out.println("From:" + routingKey + "":"" + message + """);            }         }CentOS 5.6 安装RabbitMQ http://www.linuxidc.com/Linux/2013-02/79508.htmRabbitMQ客户端C++安装详细记录 http://www.linuxidc.com/Linux/2012-02/53521.htm用Python尝试RabbitMQ http://www.linuxidc.com/Linux/2011-12/50653.htmRabbitMQ集群环境生产实例部署 http://www.linuxidc.com/Linux/2012-10/72720.htmUbuntu下PHP + RabbitMQ使用 http://www.linuxidc.com/Linux/2010-07/27309.htm在CentOS上安装RabbitMQ流程 http://www.linuxidc.com/Linux/2011-12/49610.htm二.Fanout Exchangefanout和routing key无关,它将消息无差别地(indiscriminately)传送给所有队列。fanout exchange通常用于发布/订阅模式。将消息传送给不同的队列,不同的队列对同一种消息采取不同的行为。比如,现在有一个客户订单消息被三个队列接收,队列1完成该订单,队列2将订单写入日志,队列3将订单发给别的部门什么的。比如下面的代码,消费者可以获得routing key并输出,但能否获取与routing key无关:private static String FANOUT_EXCHANGE = "FANOUT_EXCHANGE"; static class DirectProducer {public static void main(String[] args) throws IOException {ConnectionFactory connectionFactory = new ConnectionFactory();Connection connection = connectionFactory.newConnection();Channel channel= connection.createChannel();; String content = "I miss the conversation";channel.exchangeDeclare(FANOUT_EXCHANGE, ExchangeTypes.FANOUT);channel.basicPublish(FANOUT_EXCHANGE, "alvez", null, content.getBytes());}} static class DirectConsumer {public static void main(String[] args) throws IOException, InterruptedException {ConnectionFactory connectionFactory = new ConnectionFactory();Connection connection = connectionFactory.newConnection();Channel channel= connection.createChannel(); String queueName = channel.queueDeclare().getQueue();channel.queueBind(queueName, FANOUT_EXCHANGE, ""); QueueingConsumer consumer = new QueueingConsumer(channel);String s = channel.basicConsume(queueName, true, consumer);System.out.println(s);while true) {QueueingConsumer.Delivery delivery = consumer.nextDelivery();String message = new String(delivery.getBody());String routingKey = delivery.getEnvelope().getRoutingKey(); System.out.println("From:" + routingKey + "":"" + message + """);} } }更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-08/105107p2.htm