복붙노트

[SPRING] Spring 클라우드 스트림 - 애플리케이션 초기화 후 메시지 보내기

SPRING

Spring 클라우드 스트림 - 애플리케이션 초기화 후 메시지 보내기

저는 "봄철 구름의 물줄기"를 사용하여 간단한 메시지를 rabbitmq에게 보내려고합니다. 기본적으로 코드는 다음과 같습니다.

@EnableBinding(Source.class)
@SpringBootApplication
public class SourceApplication {

    public static void main(String[] args) {
        SpringApplication.run(SourceApplication.class, args);
    }

    @Autowired Source source;

    @PostConstruct
    public void init() {
        source.send(MessageBuilder.withPayload("payload").build());
    }
}

다음이 오류 메시지가 나타납니다.

org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'unknown.channel.name'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers, failedMessage=GenericMessage [payload=******, headers={id=c60dd5be-6576-99d5-fd1b-b1cb94c191c1, timestamp=1488651422892}]
at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:93)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373)

그러나 메시지를 전송하기 전에 지연 시간을 추가하면 (몇 초 또는 몇 초) 괜찮습니다. 제 질문은 : 봄이 메시지 채널을 완전히 초기화하고 메시지를 보내기 전에 어떻게 기다릴 수 있습니까?

해결법

  1. ==============================

    1.@PostConstruct가 너무 일찍 트리거됩니다 (구성 빈이 작성되었지만 컨텍스트가 시작되고 바인딩이 수행되기 전). 원하는 것은 컨텍스트가 완전히 초기화되었거나 출력 채널이 바인딩 된 후에 메시지 보내기를 트리거하는 것입니다.

    @PostConstruct가 너무 일찍 트리거됩니다 (구성 빈이 작성되었지만 컨텍스트가 시작되고 바인딩이 수행되기 전). 원하는 것은 컨텍스트가 완전히 초기화되었거나 출력 채널이 바인딩 된 후에 메시지 보내기를 트리거하는 것입니다.

    추가 빈을 만드는 데 의존하는 몇 가지 옵션이 있습니다.

  2. ==============================

    2.Spring의 Task Execution and Scheduling 기능을 살펴볼 수있다.

    Spring의 Task Execution and Scheduling 기능을 살펴볼 수있다.

    특히 34.4 절에서 다루는 것과 같은 것을 원한다는 느낌을줍니다.

    또한 비슷한 질문에 대한 답을 찾아 냈습니다.

  3. from https://stackoverflow.com/questions/42599942/spring-cloud-stream-send-message-after-application-initalization by cc-by-sa and MIT license