由于本人系统地学习和使用过rabbitmq,所以直接上代码!
topic模式代码直接联系本人
public class Constants { public static String direct_exchange = "dy-exchange"; public static String queue_direct = "dy-queue"; public static String fanout_exchange = "dy-exchange-fanout"; public static String queue_fanout_1 = "dy-queue-fanout-1"; public static String queue_fanout_2 = "dy-queue-fanout-2"; public static String topic_exchange = "dy-exchange-topic"; public static String queue_topic_1 = "dy-queue-topic-1"; public static String queue_topic_2 = "dy-queue-topic-2"; public static String queue_topic_3 = "dy-queue-topic-3"; }第一个消费者
package com.dy.direct; import com.dy.Constants; import com.rabbitmq.client.*; /** * Created by dy on 16-4-28. */ public class DirectConsumer_1 { public String host ="127.0.0.1"; public void init() throws Exception{ ConnectionFactory factory = new ConnectionFactory(); // factory.setUsername("rpc_user"); // factory.setPassword("rpcme"); factory.setHost(host); //获取链接 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel(); /** * 声明队列 * durable是否持久化,exclusive是否私有,autoDelete当最后一个消费者取消订阅的时候,对列是否自动移出 * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) */ channel.queueDeclare(Constants.queue_direct, false, false, false, null); //绑定队列,交换器,路由键(交换器根据路由规则把消息放入匹配的对队列) //不同消费者,绑定相同队列到相同交换器,这时候会均衡消费队列中的消息,不管路由规则 //不同消费者,绑定不同队列到相同交换器,这时候(交换器根据路由规则把消息放入匹配的对队列) channel.queueBind(Constants.queue_direct+"2", Constants.direct_exchange, "test"); /** * 订阅消息 * autoAck是否消息订阅到队列就确认 * basicConsume(String queue, boolean autoAck, String consumerTag, TopicConsumer_1 callback) * basicConsume(String queue, boolean autoAck, TopicConsumer_1 callback) */ QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(Constants.queue_direct, false,consumer); while (true) { try { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); // AMQP.BasicProperties props = delivery.getProperties(); String msg = new String(delivery.getBody(), "UTF-8"); System.out.println("我接收到的消息是:"+msg); System.out.println("消息的唯一ID:"+delivery.getEnvelope().getDeliveryTag()); // 返回接收到消息的确认信息 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } catch (Exception e) { System.out.println(e.toString()); } } } public static void main(String[] args) { try { new DirectConsumer_1().init(); } catch (Exception e) { e.printStackTrace(); } } }第二个消费者
package com.dy.direct; import com.dy.Constants; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.QueueingConsumer; /** * Created by dy on 16-4-28. */ public class DirectConsumer_2 { public String host ="127.0.0.1"; public void init() throws Exception{ ConnectionFactory factory = new ConnectionFactory(); // factory.setUsername("rpc_user"); // factory.setPassword("rpcme"); factory.setHost(host); //获取链接 Connection connection = factory.newConnection(); //创建信道 Channel channel = connection.createChannel(); /** * 声明队列 * durable是否持久化,exclusive是否私有,autoDelete当最后一个消费者取消订阅的时候,对列是否自动移出 * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) */ channel.queueDeclare(Constants.queue_direct, false, false, false, null); //绑定队列,交换器,路由键(交换器根据路由规则把消息放入匹配的对队列) //不同消费者,绑定相同队列到相同交换器,这时候会均衡消费队列中的消息,不管路由规则 //不同消费者,绑定不同队列到相同交换器,这时候(交换器根据路由规则把消息放入匹配的对队列) channel.queueBind(Constants.queue_direct, Constants.direct_exchange, "haha"); /** * 订阅消息 * autoAck是否自动确认,是否消息订阅到队列就确认 * basicConsume(String queue, boolean autoAck, String consumerTag, TopicConsumer_1 callback) * basicConsume(String queue, boolean autoAck, TopicConsumer_1 callback) */ QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume(Constants.queue_direct, false, consumer); while (true) { try { QueueingConsumer.Delivery delivery = consumer.nextDelivery(); String msg = new String(delivery.getBody(), "UTF-8"); System.out.println("我接收到的消息是:"+msg); // 返回接收到消息的确认信息 // 显示确认 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); } catch (Exception e) { System.out.println(e.toString()); } } } public static void main(String[] args) { try { new DirectConsumer_2().init(); } catch (Exception e) { e.printStackTrace(); } } }消息提供者
package com.dy.direct; import com.dy.Constants; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; /** *消费完,就没有了 */ public class DirectProducer { public String host ="127.0.0.1"; public Connection connection; public Channel channel; public void init() throws Exception{ ConnectionFactory factory = new ConnectionFactory(); // factory.setUsername("rpc_user"); // factory.setPassword("rpcme"); factory.setHost(host); //获取链接 connection = factory.newConnection(); //创建信道 channel = connection.createChannel(); /** * 声明交换器 * 交换器类型主要有三种 * direct:精准匹配路由键,fanout:广播匹配,topic模糊(多)匹配路由键(可以优先级) * exchangeDeclare(String exchange, String type) */ channel.exchangeDeclare(Constants.direct_exchange, "direct"); // /** // * 声明队列 // * durable是否持久化,exclusive是否私有,autoDelete当最后一个消费者取消订阅的时候,对列是否自动移出 // * queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) // */ // channel.queueDeclare(queueName, false, false, false, null); // // //绑定队列,交换器,路由键(交换器根据路由规则把消息放入匹配的对队列) // channel.queueBind(queueName, exchangeName, "routeKey"); } public void publisch(String msg) throws Exception{ //basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) this.channel.basicPublish(Constants.direct_exchange, "test", null, msg.getBytes("UTF-8")); } public void close() throws Exception{ channel.close(); connection.close(); } public static void main(String[] args) { try { DirectProducer producer = new DirectProducer(); producer.init(); String msg ="this is a msg from producer!我的序列是:"; for (int i = 1;i<8;i++){ producer.publisch(msg+i); } producer.close(); } catch (Exception e) { e.printStackTrace(); } } }