복붙노트

[SPRING] Spring 통합은 제어 버스를 통해 채널 어댑터를 수동으로 시작 / 중지합니다.

SPRING

Spring 통합은 제어 버스를 통해 채널 어댑터를 수동으로 시작 / 중지합니다.

어쨌든 수동으로 채널 어댑터를 시작 / 초기화 할 수 있습니까?

내 context.xml에 두 쌍의 인바운드 / 아웃 바운드 어댑터가 있으며 런타임에 어느 것을 시작할지 결정하려고합니다.

편집하다:

구체적인 시나리오 : 런타임에 mqtt 게시자 또는 구독자로 구성 할 수있는 클라이언트가 있습니다. 내 context.xml은 다음과 같습니다.

<int-mqtt:message-driven-channel-adapter 
    client-id="foo"
    auto-startup="true"
    url="tcp://192.168.97.164:1883"
    topics="testtopic/#"
    channel="writeToFile" />

<file:outbound-channel-adapter
    id="writeToFile"
    auto-startup="true"
    directory="./test/out"
    delete-source-files="false"/>

<int:transformer id="Transformer"
    ref="MessageTransformer"
    input-channel="readFromFile"
    output-channel="mqttOut"
    method="bytesFromFile" />

<bean id="MessageTransformer" class="MessageTransformer"/>

<int-mqtt:outbound-channel-adapter 
    id="mqttOut"
    client-id="foo"
    url="tcp://192.168.97.164:1883"
    auto-startup="false"
    default-qos="1"
    default-retained="true"
    default-topic="testtopic/bla"
    />

    <file:inbound-channel-adapter
    auto-startup="false" 
    id="readFromFile"
    directory="./test/in"
    filename-pattern="myFile*">
    <int:poller id="poller"
        fixed-rate="5000" />     
</file:inbound-channel-adapter>

보시다시피 두 가지 설정이 있습니다. 1. 가입자 사례 : mqtt 메시지 읽기 -> 파일에 쓰기 2. 게시자 사례 : 디렉토리에서 파일 폴링 -> mqtt를 통해 전송

런타임에 어떤 설정을 적용할지 결정합니다.

이 제어 버스가 정확히 여기에 어떻게 맞는지 말해 주실 수 있습니까?

해결법

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

    1.autoStartup = "false"로 설정하고 직접 start () / stop ()하거나 (send @ myAdapter.start ())를 사용하십시오.

    autoStartup = "false"로 설정하고 직접 start () / stop ()하거나 (send @ myAdapter.start ())를 사용하십시오.

    직접 참조 (autowire 등)를 얻는 것은 끝점 유형에 달려 있습니다. 폴링 된 엔드 포인트 인 경우 SourcePollingChannelAdapter를 삽입하십시오. 메시지 기반 어댑터는 다양하지만 일반적으로 MessageProducerSupport 또는 MessagingGatewaySupport입니다.

    편집하다:

    여기에서 제어 버스에 대해 읽어보십시오.

    인바운드 어댑터에 id 속성을 지정하십시오.

    을 추가하십시오.

    다음을 추가합니다.

    게이트웨이 인터페이스 만들기

    public interface Controller {
    
        void control(String command);
    
    }
    

    @ 게이트웨이를 호출합니다 (또는 context.getBean (Controller.class) 사용).

    그런 다음 어댑터를 시작할 준비가되면 전화를 겁니다. gateway.control ( "@ mqttOut.start ()").

    아웃 바운드 어댑터에는 auto-startup = "false"가 필요하지 않습니다.

    그러나 이와 같은 간단한 사용 사례의 경우, 대신 스프링 프로파일을 사용하여 조사 할 수 있습니다 (어댑터를 프로파일에 배치하고 런타임에 프로파일을 사용 가능하게 할 수 있습니다).

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

    2.이렇게하려면 먼저 채널 어댑터 자동 시작 속성을 false auto-startup = "false"로 설정 한 다음 제어 버스 시작 / 중지 어댑터를 사용해야합니다

    이렇게하려면 먼저 채널 어댑터 자동 시작 속성을 false auto-startup = "false"로 설정 한 다음 제어 버스 시작 / 중지 어댑터를 사용해야합니다

    제어 버스 예제보기 - https://github.com/spring-projects/spring-integration-samples/tree/master/basic/control-bus

  3. ==============================

    3.스프링 통합 Java DSL을 사용하여 동일한 예제를 찾고 있었지만 아무 것도 찾지 못했습니다. 그래서 직접 만들었습니다. 구성이 매우 간단합니다.

    스프링 통합 Java DSL을 사용하여 동일한 예제를 찾고 있었지만 아무 것도 찾지 못했습니다. 그래서 직접 만들었습니다. 구성이 매우 간단합니다.

    @Bean
    public IntegrationFlow controlBus() {
        return IntegrationFlows.from(controlChannel())
                .controlBus()
                .get();
    }
    
    @Bean
    public MessageChannel controlChannel() {
        return MessageChannels.direct().get();
    }
    

    중지하려면 다음을 수행하십시오.

    controlChannel.send (새 GenericMessage <> ( "@ myInboundAdapter.stop ()"));

    https://github.com/CauchyPeano/sftp-poller-control-bus

  4. from https://stackoverflow.com/questions/23915524/spring-integration-manually-start-stop-channel-adapter-via-control-bus by cc-by-sa and MIT license