docker启动rabbitMQ,通过java创建交换机、队列、绑定
通过docker启动rabbitMQ
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management
将其修改为自启动:docker update rabbitmq --restart=always
以下为通过java代码进行创建交换机、队列、绑定
@Autowired
private AmqpAdmin amqpAdmin;//用于在rabbitMq中创建Exchange(交换机)、Queue(队列)、Binding(绑定关系)
@Test
void createExchange() {
//声明一个简单的直接交换机(使用精确匹配的方式进行匹配绑定的队列)
/**
* DirectExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments) {
* 创建DirectExchange交换机的参数列表
* String name 交换机的名称,
* boolean durable 是否长久存储(在下一次启动rabbit的时候是否还存在),
* boolean autoDelete 是否自动删除(在不存在任何绑定的时候),
* Map<String, Object> arguments 参数
*/
DirectExchange directExchange = new DirectExchange("hello-java-exchange",
true,false);
amqpAdmin.declareExchange(directExchange);
log.info("Exchange(交换机)创建成功!!");
}
@Test
void createQueue(){
//在rabbitMq中声明一个队列,用于存放消息
/**
* Queue的参数列表
* Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> arguments)
* String name 队列的名称,
* boolean durable 是否长期存储(是否存在连接消费者的connection),
* boolean exclusive 是否为排他(该队列一旦被连接,就不能在连接了,只存在一个连接,默认都为false),
* boolean autoDelete 是否自动删除,
* @Nullable Map<String, Object> arguments 参数
*/
Queue queue = new Queue("hello-java-queue",true,false,false);
amqpAdmin.declareQueue(queue);
log.info("Queue(队列)创建成功!!");
}
@Test
void createBinding(){
//声明一个Binding(绑定)
/**
* 创建Binding的参数列表
* Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, @Nullable Map<String, Object> arguments)
* String destination 被绑定的队列获取交换机 A,
* Binding.DestinationType destinationType 被绑定的为交换机还是队列,
* String exchange 为那个交换机进行绑定 B,
* String routingKey 路由键(通过路由键进行推送消息),
* @Nullable Map<String, Object> arguments 参数
*
* 上述为 为 B 绑定 A
*/
Binding binding = new Binding("hello-java-queue", Binding.DestinationType.QUEUE,
"hello-java-exchange","hello.java",null);
amqpAdmin.declareBinding(binding);
log.info("Binding(绑定)创建成功!!");
}
通过java代码发送信息:
@Test
void sendMessage(){
//将发送的信息进行转化之后发送
/**
* 可以发送一个对象,但是这个对象必须实现可序列化的接口Serializable
*/
String message="hello world";
rabbitTemplate.convertAndSend("hello-java-exchange",
"hello.java",message);
log.info("消息【{}】发送成功!!!",message);
}
如果发送的消息是一个对象的话,查看到的结果为对象序列化之后的结果,对我们阅读不是很友好,我们可以将其修改将对象序列化为为json格式
操作如下:
添加一个配置类,在配置类中添加
@Configuration
public class MyRabbitMQConf {
/**
* 用于消息转化
*/
@Bean
public MessageConverter messageConverter(){
return new Jackson2JsonMessageConverter();
}
}
接收RabbitMq中发送的信息,通过使用@RabbitListener注解和@RabbitHandler注解进行获取,使用这个注解需要确保开启了Rabbit服务(是否添加@EnableRabbit注解)
其中@RabbitListener可以使用的方法上,也可以使用在类上,@RabbitHandler只能使用在类上,将他们联合使用,可以解决在同一个队列中,储存的消息的类型不同,在获取到该消息之后执行的方法也是不同的
实例代码如下:
@RabbitListener(queues = "hello-java-queue")
public class Test {
//当接收到的信息的类型为Dog的时候执行的方法,RabbitMQ中存放的全部信息都在Message中,spring rabbit会自动将Message中body信息转化为我们传入的对象的类型
@RabbitHandler
public void m1(Message message,Dog dog){
System.out.println("当前获取的对象信息为:"+dog);
}
//当接收到的信息的类型为Cat的时候执行的方法
@RabbitHandler
public void m2(Message message,Cat cat){
System.out.println("当前获取的对象信息为:"+cat);
}
}
还存在一种创建队列、交换机、绑定关系的方式:就在Spring容器中直接使用@Bean注解添加Queue、Exchange、Binding对象就可以了
实例:
/**
* @author just1t
* @date 2023/5/20 16:00
* @introduce 在RabbitMQ中创建交换机、队列、绑定关系的两种方式
* 第一种方式:通过使用AmqpAdmin进行创建
* 第二种方式:直接在Spring容器中添加对应的对象,Spring连接到RabbitMQ之后,MQ会自动创建,前提是MQ之前不存在的情况
*/
@Configuration
public class MyMQConf {
/**
* order服务的主交换机
* @return
*/
@Bean
public Exchange orderEventExchange(){
//创建一个模糊匹配的交换机,不同的交换机匹配规则就不同
return new TopicExchange("order-event-exchange",true,false);
}
}