SpringBoot 集成 RabbitMq
今天有时间做了小的rabbitmq测试
一、pom依赖
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
二、application.yml 配置
server:
port: 12345
spring:
profiles:
active: dev
application:
name: rabbit-receiver
rabbitmq:
host: 127.0.0.1
port: 5672
username: allen
password: 654321
#虚拟host 可以不设置,使用server默认host
virtual-host: rtest
三、rabbitmqConfig
序列化消息或者自定义工厂类
@Configuration
public class RabbitMqConfig implements RabbitListenerConfigurer {
@Autowired
public ConnectionFactory connectionFactory;
@Bean
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
// 这里的转换器设置实现了 通过 @Payload 注解 自动反序列化message body
factory.setMessageConverter(new MappingJackson2MessageConverter());
return factory;
}
// 自定义Factory
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory());
}
//@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
return factory;
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
// 这里的转换器设置实现了发送消息时自动序列化消息对象为message body
template.setMessageConverter(jsonMessageConverter());
return template;
}
}
四、发送消息
首先绑定exchange和queue
@Configuration
public class FanoutRabbitConfig {
@Bean
public Queue fanoutQueue1() {
return new Queue("a");
}
@Bean
public Queue fanoutQueue2() {
return new Queue("b");
}
@Bean
public Queue fanoutQueue3() {
return new Queue("c");
}
@Bean
FanoutExchange fanoutExchange() {
return new FanoutExchange("FanoutExchange");
}
@Bean
Binding bindFanoutQueue1() {
return BindingBuilder.bind(fanoutQueue1()).to(fanoutExchange());
}
@Bean
Binding bindFanoutQueue2() {
return BindingBuilder.bind(fanoutQueue2()).to(fanoutExchange());
}
@Bean
Binding bindFanoutQueue3() {
return BindingBuilder.bind(fanoutQueue3()).to(fanoutExchange());
}
发送消息
@RestController
public class SendController {
@Autowired
private RabbitTemplate rabbitTemplate; //使用RabbitTemplate,这提供了接收/发送等等方法
@GetMapping("/send-direct-message")
public String sendDirectMessage() {
Student student = new Student();
student.setId(2L);
student.setName("sss");
//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchange
rabbitTemplate.convertAndSend("TestDirectExchange","TestDirectQueue",student);
System.out.println("------------------map"+ student.toString());
return "success";
}
@GetMapping("/send-topic-message")
public String sendTopicMessage() {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "topic test message, hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String,Object> map=new HashMap<>();
map.put("messageId",messageId);
map.put("messageData",messageData);
map.put("createTime",createTime);
rabbitTemplate.convertAndSend("TestTopicExchange", "test.6", map);
System.out.println("------------------map"+ map);
return "success";
}
@GetMapping("/send-fanout-message")
public String sendFanoutMessage() {
String messageId = String.valueOf(UUID.randomUUID());
String messageData = "fanout test message, hello!";
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String,Object> map=new HashMap<>();
map.put("messageId",messageId);
map.put("messageData",messageData);
map.put("createTime",createTime);
rabbitTemplate.convertAndSend("TestTopicExchange", "test.6", map);
System.out.println("------------------map"+ map);
return "success";
}
}
rabbitTemplate.convertAndSend(“TestTopicExchange”, “test.6”, map);
第一个参数是exchange的名字,第二个参数是queue的名字
五、接收消息
@Component
@RabbitListener(queues = "test.1")//监听的队列名称 TestDirectQueue
public class TopicListener {
@RabbitHandler
public void process(Map testMessage) {
System.out.println("TopicReceiver消费者收到消息 : " + testMessage.toString());
}
}
@Component
//监听的队列名称 TestDirectQueue
public class DirectListener2 {
@RabbitListener(queuesToDeclare= @Queue("TestDirectQueue"))
public void process(String testMessage) {
System.out.println("DirectReceiver4消费者收到消息 : " + testMessage);
}
}
@RabbitListener注解可以加在类上,也可以加在方法上