在前一篇博客中我们往MessageListenerContainer设置了MessageListener进行消息的消费,本篇博客将介绍一种更为简单的消息消费方式:使用@RabbitListener注解方式。使用RabbitListener进行消息的消费步骤如下
1.在启动类上添加@EnableRabbit注解
2.在Spring容器中托管一个RabbitListenerContainerFactory,默认实现类SimpleRabbitListenerContainerFactory
3.编写一个消息处理器类托管到Spring容器中,并使用@RabbitListener注解标注该类为RabbitMQ的消息处理类
4.使用@RabbitHandler注解标注在方法上,表示当有收到消息的时候,就交给带有@RabbitHandler的方法处理,具体找哪个方法需要根据MessageConverter转换后的对象类型决定
本系列博客源码GIT地址:https://github.com/RobertoHuang/RGP-RABBITMQ.git
1.创建生产者配置类
@Configuration
public class SpringAMQPProducerConfig {
@Bean
public org.springframework.amqp.rabbit.connection.ConnectionFactory connectionFactory() {
com.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();
connectionFactory.setHost("192.168.56.128");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("roberto");
connectionFactory.setPassword("roberto");
connectionFactory.setAutomaticRecoveryEnabled(true);
connectionFactory.setNetworkRecoveryInterval(10000);
Map connectionFactoryPropertiesMap = new HashMap();
connectionFactoryPropertiesMap.put("principal", "RobertoHuang");
connectionFactoryPropertiesMap.put("description", "RGP订单系统V2.0");
connectionFactoryPropertiesMap.put("emailAddress", "[email protected]");
connectionFactory.setClientProperties(connectionFactoryPropertiesMap);
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(connectionFactory);
return cachingConnectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(org.springframework.amqp.rabbit.connection.ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
@Bean
public RabbitTemplate rabbitTemplate(org.springframework.amqp.rabbit.connection.ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
}
2.创建生产者启动类
@ComponentScan(basePackages = "roberto.growth.process.rabbitmq.spring.amqp.annotation.producer")
public class ProducerApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProducerApplication.class);
RabbitAdmin rabbitAdmin = context.getBean(RabbitAdmin.class);
RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);
rabbitAdmin.declareExchange(new DirectExchange("roberto.order", true, false, new HashMap<>()));
MessageProperties messageProperties = new MessageProperties();
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
messageProperties.setContentType("UTF-8");
Message message = new Message("订单信息".getBytes(), messageProperties);
rabbitTemplate.send("roberto.order", "", message);
}
}
3.创建消费者配置类 将RabbitListenerContainerFactory交由Spring托管
@Configuration
public class SpringAMQPConsumerConfig {
@Bean
public ConnectionFactory connectionFactory() {
com.rabbitmq.client.ConnectionFactory connectionFactory = new com.rabbitmq.client.ConnectionFactory();
connectionFactory.setHost("192.168.56.128");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("roberto");
connectionFactory.setPassword("roberto");
connectionFactory.setAutomaticRecoveryEnabled(true);
connectionFactory.setNetworkRecoveryInterval(10000);
Map connectionFactoryPropertiesMap = new HashMap();
connectionFactoryPropertiesMap.put("principal", "RobertoHuang");
connectionFactoryPropertiesMap.put("description", "RGP订单系统V2.0");
connectionFactoryPropertiesMap.put("emailAddress", "[email protected]");
connectionFactory.setClientProperties(connectionFactoryPropertiesMap);
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(connectionFactory);
return cachingConnectionFactory;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
@Bean
public RabbitListenerContainerFactory> rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory = new SimpleRabbitListenerContainerFactory();
simpleRabbitListenerContainerFactory.setConnectionFactory(connectionFactory);
// 设置消费者线程数
simpleRabbitListenerContainerFactory.setConcurrentConsumers(5);
// 设置最大消费者线程数
simpleRabbitListenerContainerFactory.setMaxConcurrentConsumers(10);
// 设置消费者标签
simpleRabbitListenerContainerFactory.setConsumerTagStrategy(new ConsumerTagStrategy() {
@Override
public String createConsumerTag(String s) {
return "RGP订单系统ADD处理逻辑消费者";
}
});
return simpleRabbitListenerContainerFactory;
}
}
4.自定义消费者消息处理器类 在消息处理器类中使用@RabbitListener注解声明该类为RabbitMQ消息处理器类,并在bindings属性中声明了队列和交换机已经它们之间的绑定关系(监听roberto.order.add队列),使用@RabbitHandler注解声明具体消息处理方法
@Component
@RabbitListener(bindings = {@QueueBinding(value = @Queue(value = "roberto.order.add", durable = "true", autoDelete = "false", exclusive = "false"), exchange = @Exchange(name = "roberto.order"))})
public class SpringAMQPMessageHandle {
@RabbitHandler
public void add(byte[] body) {
System.out.println("----------byte[]方法进行处理----------");
try {
System.out.println(new String(body, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
5.创建消费者启动类 添加@EnableRabbit注解
@EnableRabbit
@ComponentScan(basePackages = "roberto.growth.process.rabbitmq.spring.amqp.annotation.consumer")
public class ConsumerApplication {
public static void main(String[] args) {
new AnnotationConfigApplicationContext(ConsumerApplication.class);
}
}
6.依次启动消息消费者和生产者 控制台输出如下
----------byte[]方法进行处理----------
订单信息