目录
3.阿里云安全组或腾讯云防火墙开放5672端口(15672是控制台的web端口,5672连接端口)
广播模式
简单的讲,就是把交换机(Exchange)里的消息发送给所有绑定该交换机的队列,忽略routingKey。
准备
创建一个maven
导入依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-amqp</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>3.0.4</version>
</dependency>
1.生产者代码
package com.sj;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
//广播模式-消息生产者
public class Producer {
public static void main(String[] args) {
//New一个RabbitMQ的连接工厂
ConnectionFactory factory = new ConnectionFactory();
//设置需要连接的RabbitMQ地址,这里指向本机
factory.setHost("安装RabbitMQ的服务器地址");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("admin");
factory.setPassword("admin");
try {
//尝试获取一个连接
Connection connection = factory.newConnection();
//尝试创建一个channel
Channel channel = connection.createChannel();
String message = "我是生产者生产的消息";
//声明交换机(参数为:交换机名称; 交换机类型,广播模式)
channel.exchangeDeclare("fanoutLogs", BuiltinExchangeType.FANOUT);
//消息发布(参数为:交换机名称; routingKey,忽略。在广播模式中,生产者声明交换机的名称和类型即可)
channel.basicPublish("fanoutLogs","", null,message.getBytes());
// logger.info("********Message********:发送成功");
System.out.println("********Message********:发送成功");
channel.close();
connection.close();
} catch (IOException |TimeoutException e) {
e.printStackTrace();
}
}
}
2.消费者代码
package com.sj;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
//广播模式-消息消费者
public class Consumer1 {
public static void main(String[] args) {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("安装rabbitMQ的服务器地址");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("admin");
factory.setPassword("admin");
try {
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
//交换机声明(参数为:交换机名称;交换机类型)
channel.exchangeDeclare("fanoutLogs",BuiltinExchangeType.FANOUT);
//获取一个临时队列
String queueName = channel.queueDeclare().getQueue();
//队列与交换机绑定(参数为:队列名称;交换机名称;routingKey忽略)
channel.queueBind(queueName,"fanoutLogs","");
System.out.println("********Waiting for messages********");
//这里重写了DefaultConsumer的handleDelivery方法,因为发送的时候对消息进行了getByte(),在这里要重新组装成String
com.rabbitmq.client.Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
super.handleDelivery(consumerTag, envelope, properties, body);
String message = new String(body,"UTF-8");
System.out.println("received:" + message);
}
};
//声明队列中被消费掉的消息(参数为:队列名称;消息是否自动确认;consumer主体)
channel.basicConsume(queueName,true,consumer);
//这里不能关闭连接,调用了消费方法后,消费者会一直连接着rabbitMQ等待消费
} catch (IOException |TimeoutException e) {
e.printStackTrace();
}
}
}
3.阿里云安全组或腾讯云防火墙开放5672端口(15672是控制台的web端口,5672连接端口)
4.创建三个消费者和一个生产者