使用代码配置队列,交换器和绑定通常可以直接使用RabbitAdmin
默认情况下,当任何异常发生时,RabbitAdmin将立即停止处理所有声明;这可能会导致下游问题——例如,由于没有声明另一个队列(在错误队列之后定义的),侦听器容器无法初始化。
可以通过将RabbitAdmin上的ignore-declaration-exceptions属性设置为true来修改此行为。这个选项指示RabbitAdmin记录异常,并继续声明其他元素。当使用java配置RabbitAdmin时,这个属性是ignoredeclarationexception。这是一个全局设置,适用于所有元素、队列、交换器和绑定,具有一个类似的属性,仅适用于这些元素。
在1.6版本之前,此属性仅在通道上发生IOException时(例如当前属性与所需属性不匹配时)才生效。现在,该属性将对任何异常生效,包括TimeoutException等。
此外,任何声明异常都会导致DeclarationExceptionEvent的发布,该事件是一个ApplicationEvent,上下文中的任何ApplicationListener都可以使用该事件。事件包含对admin的引用、正在声明的元素和可抛出的元素。
配置bean
代码语言:javascript复制 @Bean
public RabbitAdmin rabbitAdmin(CachingConnectionFactory cachingConnectionFactory){
RabbitAdmin rabbitAdmin = new RabbitAdmin(cachingConnectionFactory);
rabbitAdmin.setIgnoreDeclarationExceptions(true);
return rabbitAdmin;
}
使用
代码语言:javascript复制//声明队列
rabbitAdmin.declareQueue(new Queue("aaa", true));
//声明交换器
rabbitAdmin.declareExchange(new TopicExchange("aaaa"));
//绑定队列和交换器
rabbitAdmin.declareBinding(new Binding("aaa", Binding.DestinationType.QUEUE,"aaa", "aaa", null));
也可以直接创建channel
这种方式涉及到channel不停的打开和关闭,可能需要进行一定的管理
代码语言:javascript复制 Channel channel = connectionFactory.createConnection().createChannel(false);
channel.queueDeclare("bbb", true, false, false , null);
channel.exchangeDeclare("bbb", BuiltinExchangeType.TOPIC);
channel.queueBind("bbb", "bbb", "bbb");
channel.close();