我想从rabbitMQ plugin创建延迟交换。
首先我尝试使用弹簧活页夹,我可以看到delayed-exchange
标志可用:
spring:
cloud:
stream:
bindings:
delayed-ex:
group: update-delayed
contentType: application/json
consumer:
max-attempts: 1
rabbit:
bindings:
delayed-ex:
consumer:
transacted: true
auto-bind-dlq: true
republish-to-dlq: true
delayed-exchange: true
requeue-rejected: false
不幸的是,这个配置创建了一个没有任何标志的简单topic
交换。
我可以用:
创建bean@Bean
public CustomExchange delayedExchange() {
final Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "topic");
return new CustomExchange("delayed-ex", "x-delayed-message", true, false, args);
}
它正在使用当前的配置,但是它给了我关于我想要覆盖的现有交换的堆栈跟踪:
引起:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#method(reply-code = 406,reply-text = PRECONDITION_FAILED - 在vhost'/'中用于交换'delayed-ex'的不等效arg'类型':收到'主题'但是当前是''x-delayed-message '',class-id = 40,method-id = 10)
另一件事(不知道是否有问题)我希望在同一服务中拥有消费者和生产者,只是为我的消息提供缓冲。
另外,我检查了delayed-exchange
标志的来源,看到这个标志什么都没做(我错了吗?),因为isDelayed
的{{1}}方法没有调用。< / p>
是否可以使用类型AbstractExchange
声明延迟交换并通过配置执行,而不是声明bean?我也想删除那个stacktraces
答案 0 :(得分:0)
问题在于spring-rabbit
依赖的错误版本。我使用了不使用1.5.6.RELEASE
方法的isDelayed()
。将其更改为1.7.3.RELEASE
版本可解决问题。
我删除了自定义bean并创建了这个配置:
spring
cloud:
stream:
bindings:
delayed-ex:
group: update-delayed
contentType: application/json
consumer:
max-attempts: 1
rabbit:
bindings:
delayed-ex:
consumer:
transacted: true
auto-bind-dlq: true
republish-to-dlq: true
delayed-exchange: true
requeue-rejected: false
producer:
delayed-exchange: true
现在,交换和队列是由config自动创建的,没有任何堆栈跟踪。