RabbitMQ exchange使用-广播模式(Publish Subscribe)
1 简介
广播模式,将消息发布到交换器上,所有和这个交换器绑定的队列都可以接收到。
如果此刻没有绑定队列就是丢弃了。
这个和微信公众号的订阅差不多
交换机类型 : fanout(不处理路由键)
2 代码
2.1 生产者
package com.yzcq.rabbitmq.publishsubscribe;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.MessageProperties;
import com.yzcq.rabbitmq.util.ConnectionUtil;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发布和订阅模式-生产者
*/
public class Send {
private static final String EXCHANGE_NAME = "test-exchange_name";
public static void main(String[] argv) throws IOException, TimeoutException {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
//声明一个交换机
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//循环发消息发消息
for (int i = 0; i < 50; i++) {
String message = "我是发送者 订阅发布者【"+i+"】";
//广播模式,将消息发布到交换器上,所有和这个交换器绑定的队列都可以接收到。如果此刻没有绑定队列就是丢弃了。
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
System.out.println(" 消息内容: " + message + "'");
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
channel.close();
connection.close();
}
}
2.2 消费者1
package com.yzcq.rabbitmq.publishsubscribe;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.yzcq.rabbitmq.util.ConnectionUtil;
import java.io.IOException;
/**
* 发布和订阅模式-消费者1
*/
public class Receiver1 {
private static final String EXCHANGE_NAME = "test-exchange-name";
public static void main(String[] argv) throws Exception {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
//声明一个交换机
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//获取一个临时队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到交换机上
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println(" [1] 等待接受消息. 如果要退出按 CTRL+C");
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println(" [1] Received '" + message + "'");
try {
Thread.sleep(2000);
}
catch (InterruptedException _ignored) {
Thread.currentThread().interrupt();
}
}
};
channel.basicConsume(queueName, true, consumer);
}
}
2.3 消费者2
package com.yzcq.rabbitmq.publishsubscribe;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
import com.yzcq.rabbitmq.util.ConnectionUtil;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 发布和订阅模式-消费者2
*/
public class Receiver2 {
private static final String EXCHANGE_NAME = "test-exchange-name";
public static void main(String[] argv) throws Exception {
Connection connection = ConnectionUtil.getConnection();
Channel channel = connection.createChannel();
//声明一个交换机
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
//获取一个临时队列
String queueName = channel.queueDeclare().getQueue();
//将队列绑定到交换机上
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println(" [2] 等待接受消息. 如果要退出按 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");
System.out.println(" [2] Received '" + message + "'");
}
};
channel.basicConsume(queueName, true, consumer);
}
}