2017-08-30 25 views
0

我想创建从rabbitMQ plugin延迟交换。SpringCloudStream - 如何创建延迟交换?

起初,我试图用簧粘合剂,因为我可以看到,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 
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'的不等价参数'type':收到'topic',但是current是''x-delayed-message ',class-id = 40,method-id = 10)

另一件事(不知道是否是一个问题)我想让消费者和生产者在同一个服务中,为我的消息。

另外,我检查了delayed-exchange标志的来源,并看到这个标志没有做任何事情(我错了吗?),因为方法从AbstractExchange不被调用。

是否可以申报类型为x-delayed-message的延迟交换,并通过配置来完成,而不是声明bean?此外,我想删除堆栈跟踪

回答

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 

现在,交换和队列由配置自动创建的,没有任何踪迹。