SpringCloudStream - 如何创建延迟交换?

时间:2017-08-30 10:43:22

标签: java spring rabbitmq

我想从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

1 个答案:

答案 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自动创建的,没有任何堆栈跟踪。