@Configuration
public class RabbitmqConfig {
/**
* primaryrabbitMQ
*
* @return
*/
@Bean(name = "primaryRabbitTemplate")
@Primary
public RabbitTemplate primaryRabbitTemplate(@Qualifier("primaryConnectionFactory") ConnectionFactory connectionFactory) {
return new RabbitTemplate(connectionFactory);
}
@Bean("primaryConnectionFactory")
@Primary
public ConnectionFactory innerRabbitConfiguration(@Value("${primary.rabbitmq.host}") String host,
@Value("${primary.rabbitmq.port}") int port,
@Value("${primary.rabbitmq.username}") String username,
@Value("${primary.rabbitmq.password}") String password,
@Value("${primary.rabbitmq.virtual-host}") String virtualHost) {
return this.rabbitConnection(host, port, username, password,virtualHost);
}
@Bean("primaryRabbitContainerFactory")
@Primary
public SimpleRabbitListenerContainerFactory consumeRabbitFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
@Qualifier("primaryConnectionFactory") ConnectionFactory connectionFactory) {
return this.rabbitFactory(configurer, connectionFactory);
}
public ConnectionFactory rabbitConnection(String host, int port, String username, String password, String virtualHost) {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
connectionFactory.setVirtualHost(virtualHost);
return connectionFactory;
}
public SimpleRabbitListenerContainerFactory rabbitFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
return factory;
}
}
注意:如果配置了多个rabbitConnectionFactory,再使用@RabbitListener 监控队列时,必须指定containerFactory,不如会监听容器中的第一个containerFactory
@RabbitListener(queues = {RabbitmqConstants.QUEUE_NORMAL_FACE, RabbitmqConstants.QUEUE_ALARM_FACE},containerFactory = "primaryRabbitContainerFactory")
@RabbitHandler
public void listener(@Payload String msg, Channel channel, Message message) {
try {
log.info("queues[{}] receive message [{}] ", message.getMessageProperties().getConsumerQueue(), msg);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
if (message.getMessageProperties().getRedelivered()) {
try {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
} catch (IOException e1) {
e1.printStackTrace();
}
} else {
try {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
} catch (IOException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
}