RabbitMq的交换机有三种模式,下面简单举例子介绍一下fanout模式
多个队列绑定一个交换机,那么当发送消息到该交换机时,其绑定的所有队列都能收到相同消息,类似于广播一样。
下面简单代码举例
连接mq工具类
package com.util;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* 此类为连接工厂创建信道的工具类
*/
public class Util {
public static Channel getChannel() throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
//连接ip 用户名 密码
factory.setHost("192.168.126.130");
factory.setUsername("root");
factory.setPassword("123456");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
return channel;
}
}
生产者
package com.five;
import com.rabbitmq.client.Channel;
import com.util.Util;
import java.util.Scanner;
/**
* 发送消息
*/
public class EmitLog {
//交换机的名称
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception{
//连接mq
Channel channel = Util.getChannel();
//声明一个交换机 类型为fanout
channel.exchangeDeclare(EXCHANGE_NAME,"fanout");
//从控制台中接收消息
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String message = scanner.next();
channel.basicPublish(EXCHANGE_NAME,"",null,message.getBytes("UTF-8"));
System.out.println("发送消息完成"+message);
}
}
}
接受消息创建两个
接收者1
package com.five;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.util.Util;
/**
* 消息接收
*/
public class ReceiveLogs01 {
//交换机的名称
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception{
//连接mq
Channel channel = Util.getChannel();
/**
* 声明一个临时队列 队列的名称是随机的
* 当消费者断开与队列的连接的时候,自动删除队列
*/
String queue = channel.queueDeclare().getQueue();
/**
* 绑定交换机与队列
*
*/
channel.queueBind(queue,EXCHANGE_NAME,"");
DeliverCallback deliverCallback = (consumerTag, message) ->{
System.out.println("ReceiveLogs01控制台打印接受的消息:"+ new String(message.getBody()));
};
//取消消息时的回调
CancelCallback cancelCallback = consumerTag ->{
System.out.println("消息消费被中断");
};
//接收消息
channel.basicConsume(queue,true,deliverCallback,cancelCallback);
}
}
接收者2
package com.five;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.util.Util;
public class ReceiveLogs02 {
//交换机的名称
public static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
//连接mq
Channel channel = Util.getChannel();
/**
* 声明一个临时队列 队列的名称是随机的
* 当消费者断开与队列的连接的时候,自动删除队列
*/
String queue = channel.queueDeclare().getQueue();
/**
* 绑定交换机与队列
*
*/
channel.queueBind(queue, EXCHANGE_NAME, "");
DeliverCallback deliverCallback = (consumerTag, message) -> {
System.out.println("ReceiveLogs02控制台打印接受的消息:" + new String(message.getBody()));
};
//取消消息时的回调
CancelCallback cancelCallback = consumerTag -> {
System.out.println("消息消费被中断");
};
//接收消息
channel.basicConsume(queue, true, deliverCallback, cancelCallback);
}
}
分别启动这三个,发送多条消息
发消息
接受者1
接收者2
这样就简单的实现了fanout模式。