主要解决两个问题:
1如何发送/发布消息(将java对象序列化为json),通过使用RabbitTemplate
2如何读取消费消息(json反序列化为java对象)使用@RabbitListener注解
amqp是一个规范,一种定义了两个系统间通过消息进行交互的协议,而RabbitMQ则是实现了该规范的一个强大的中间件产物。
我们通过设置两个监听队列分别演示通用消息的处理及自定义消息类的处理。
maven依赖:
1 2 3 4 | <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> </dependency> |
javaBean:CustomMessage
public class CustomMessage implements Serializable{
private String text;
private int priority;
private boolean secret;
// Default constructor is needed to deserialize JSON
public CustomMessage() {
}
public CustomMessage(String text, int priority, boolean secret) {
this.text = text;
this.priority = priority;
this.secret = secret;
}
public String getText() {
return text;
}
public int getPriority() {
return priority;
}
public boolean isSecret() {
return secret;
}
@Override
public String toString() {
return "CustomMessage{" +
"text='" + text + '\'' +
", priority=" + priority +
", secret=" + secret +
'}';
}
}
消息生产者:
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Component public class CustomMessageSender {
private static final Logger log = LoggerFactory.getLogger(CustomMessageSender.class);
private final RabbitTemplate rabbitTemplate;
@Autowired public CustomMessageSender(final RabbitTemplate rabbitTemplate) { this.rabbitTemplate = rabbitTemplate; }
@Scheduled(fixedDelay = 3000L) public void sendMessage() { final CustomMessage message = new CustomMessage("Hello there!", new Random().nextInt(50), false); log.info("Sending message..."); rabbitTemplate.convertAndSend(MessagingApplication.EXCHANGE_NAME, MessagingApplication.ROUTING_KEY, message); } } |
消息消费者:
@Component
public class CustomMessageListener {
private static final Logger log = LoggerFactory.getLogger(CustomMessageListener.class);
@RabbitListener(queues = MessagingApplication.QUEUE_GENERIC_NAME)
public void receiveMessage(final Message message) {
log.info("Received message as generic: {}", message.toString());
}
@RabbitListener(queues = MessagingApplication.QUEUE_SPECIFIC_NAME)
public void receiveMessage(final CustomMessage customMessage) {
log.info("Received message as specific class: {}", customMessage.toString());
}
}
SpringBoot主类:
@SpringBootApplication
@EnableRabbit
@EnableScheduling
public class MessagingApplication implements RabbitListenerConfigurer {
@Bean
public TopicExchange appExchange() {
return new TopicExchange(EXCHANGE_NAME);
}
@Bean
public Queue appQueueGeneric() {
return new Queue(QUEUE_GENERIC_NAME);
}
@Bean
public Queue appQueueSpecific() {
return new Queue(QUEUE_SPECIFIC_NAME);
}
@Bean
public Binding declareBindingGeneric() {
return BindingBuilder.bind(appQueueGeneric()).to(appExchange()).with(ROUTING_KEY);
}
@Bean
public Binding declareBindingSpecific() {
return BindingBuilder.bind(appQueueSpecific()).to(appExchange()).with(ROUTING_KEY);
}
@Bean
public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
final RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
return rabbitTemplate;
}
@Bean
public Jackson2JsonMessageConverter producerJackson2MessageConverter() {
return new Jackson2JsonMessageConverter();
}
@Bean
public MappingJackson2MessageConverter consumerJackson2MessageConverter() {
return new MappingJackson2MessageConverter();
}
@Bean
public DefaultMessageHandlerMethodFactory messageHandlerMethodFactory() {
DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory();
factory.setMessageConverter(consumerJackson2MessageConverter());
return factory;
}
@Override
public void configureRabbitListeners(final RabbitListenerEndpointRegistrar registrar) {
registrar.setMessageHandlerMethodFactory(messageHandlerMethodFactory());
}
@EnableRabbit@EnableScheduling 用于启用rabbit相关的注解和定时任务相关注解,当前设定的3000L单位为毫秒。