具有自动配置的属性不适用于Spring Cloud Stream和Rabbitmq

时间:2018-06-21 11:15:49

标签: spring rabbitmq spring-cloud-stream

我有一个配置服务器,具有属性和微服务作为使用者。

我尝试配置maxAttempts以避免重试消费者微服务,但这似乎不起作用。

我还定义了配置服务器上的绑定属性,它们工作正常。我的消费者正在收听和接收消息,但是它尝试了3次,然后崩溃了。

这是我在配置服务器中的application.yml

server:
  servlet:
    contextPath: /cmsrsssitemap/v1

spring:
  cloud:
    stream:
      bindings:
        sitemap-main-output:
          destination: sitemap-main
          group: cms-microservices-v1
          content-type: application/json
          #consumer.concurrency: 2
        test-job-output:
          destination: test-job
          group: cms-microservices-v1
          content-type: application/json
      rabbit:
        bindings:
          test-job-output: 
            consumer:
              maxAttempts: 1
              requeueRejected: false
              autoBindDlq: true
              #dlqTtl: 5000
              #requeueRejected: false
              #dlqDeadLetterExchange: dltexchange1
              #republishToDlq: true

这是生产者端的application.yml

server.servlet.contextPath: /cmsjmshandler/v1

spring:
  cloud:
    stream:
      bindings:
        sitemap-main-input:         
          destination: sitemap-main
          content-type: application/json
        test-job-input:
          destination: test-job
          group: cms-microservices-v1
          content-type: application/json

这是骗子。它抛出一个NullPointer进行测试

@Component
public class TestJobListener {


    @StreamListener(StreamProcessor.TEST_JOB)
    public void testJobInput(@Payload String input) throws InterruptedException {
//      Thread.sleep(3000);
        System.out.println("########################### "+new Date() + " Mensaje Recibido");
        throw new NullPointerException();
    }
}

StreamProcesor.java

public interface StreamProcessor {

    public static final String TEST_JOB = "test-job";

    public static final String SITEMAP_MAIN = "sitemap-main";


    @Input(StreamProcessor.TEST_JOB)
    SubscribableChannel testJobOutputInput();

    @Input(StreamProcessor.SITEMAP_MAIN)
    SubscribableChannel processSitemapMain();
}

这样做的目的是将失败的消息移至DLQ,但这也不起作用

编辑1:无法使其正常工作。我已经根据Artem Bilan进行了更改,但这也不起作用。

server:
  servlet:
    contextPath: /cmsrsssitemap/v1

spring:
  cloud:
    stream:
      bindings:
        test-job-output:
          destination: test-job
          group: cms-microservices-v1
          content-type: application/json
          consumer:
            maxAttempts: 1
      rabbit:
        bindings:
          test-job-output: 
            consumer:
              requeueRejected: false

3 个答案:

答案 0 :(得分:1)

maxAttempts不是rabbit属性。这是一个核心。

此文档中有一个示例:https://docs.spring.io/spring-cloud-stream/docs/Elmhurst.RELEASE/reference/htmlsingle/#spring-cloud-stream-overview-error-handling

spring.cloud.stream.bindings.input.consumer.max-attempts=1
spring.cloud.stream.rabbit.bindings.input.consumer.requeue-rejected=true

答案 1 :(得分:0)

问题是我在StreamProcesor上输入了错误的名称

  case 'REMOVE_FL_EVENT' : 
    return{
      ...state,
      events: Object.keys(state.events).map(group => {
        return state.events[group].filter(item => item.id !== action.id)
      })
    }

StreamProcesor.TEST_JOB应该是频道名称,也不是目的地。更新我的问题。

更正了SteamProcesor.java StreamProcesor.java

@StreamListener(StreamProcessor.TEST_JOB)

答案 2 :(得分:0)

我刚刚对其进行了测试,并且此配置(更正后的配置)对我来说效果很好。如果在客户端上启用actuator/env端点,则可以看到以下属性:

enter image description here

(我使用了input和一个基于本地文件的配置服务器)。