Spring

스프링 부트에서 동기화 팩토리로 아웃 바운드 채널 어댑터를 구성하는 방법

기록만이살길 2021. 3. 14. 15:04
반응형

스프링 부트에서 동기화 팩토리로 아웃 바운드 채널 어댑터를 구성하는 방법

1. 질문(문제점):

스프링 부트에서 다음 아웃 바운드 채널 어댑터 구성과 동일한 것은 무엇입니까? 가정 messageChannel, taskExecutor그리고 synchronizationFactory정의된다.

    <int:outbound-channel-adapter id="outboundChannelAdapter" channel="messageChannel" ref="handler" method="handle">
        <int:poller task-executor="taskExecutor" fixed-delay="500" receive-timeout="500" max-messages-per-poll="10">
            <int:transactional synchronization-factory="synchronizationFactory" isolation="READ_COMMITTED"/>
        </int:poller>
    </int:outbound-channel-adapter>

@ServiceActivator@Poller어노테이션 트랜잭션 동기화 공장에 대한 옵션을 갖고있는 것 같다하지 않습니다. PollerMetadata그것을위한 옵션이 있습니다하지만 난에 해당 인스턴스를 연결하는 방법을 잘 모르겠어요 @ServiceActivator.

이 경우 동기화 팩토리는 여러 스레드를 읽는 DB 기반 채널이기 때문에 필요합니다.

2. 해결방안:

이 같은:

@ServiceActivator(inputChannel = "messageChannel", poller = @Poller("myPollerMetadata"))
public void handle(Message<?> message) { // Or what is your service method signature
    ...
}

@Bean
PollerMetadata myPollerMetadata(Executor taskExecutor, TransactionSynchronizationFactory synchronizationFactory) {

    PollerMetadata poller = new PollerMetadata();
    poller.setTransactionSynchronizationFactory(synchronizationFactory);
    poller.setMaxMessagesPerPoll(10);
    poller.setReceiveTimeout(500);
    poller.setTaskExecutor(taskExecutor);
    poller.setTrigger(new PeriodicTrigger(500));
    return poller;
}

Spring Integration Java DSL : https://docs.spring.io/spring-integration/reference/html/dsl.html#java-dsl 학습을 시작할 수도 있습니다 . 동일한 구성은 다음과 같습니다.

@Bean
IntegrationFlow myHandlerFlow(Executor taskExecutor, TransactionSynchronizationFactory synchronizationFactory) {
    return IntegrationFlows.from("messageChannel")
              .handle(handler, "handle", 
                            c -> c.poller(p -> p
                                     .fixedDelay(500)
                                     .transactionSynchronizationFactory(synchronizationFactory)
                                     .taskExecutor(taskExecutor)
                                     .receiveTimeout(500)
                                     .maxMessagesPerPoll(10)))
              .get();
}
65704511
반응형