执行出站操作后激活另一个适配器

时间:2018-08-15 13:21:14

标签: spring-boot spring-integration

考虑其中的操作流程如下:

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───┐
  ┌──────┐                                            │ A │
│ │Poller│                                            └───┤
  └──────┘  ┌────────────┐                ┌────────────┐   
│     │     │ Get local  │                │            │  │
      │     │    file    │   ┌────────┐   │SFTP file to│   
│     └─────▶'test1.txt' │───▶ Chnnl1 ├───▶   remote   │  │
            │            │   └────────┘   │            │   
│           └────────────┘                └────────────┘  │

│                                                         │
 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 
┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┬───┐
                                                      │ B │
│                                                     └───┤

│        ┌────────────┐                ┌────────────┐     │
         │ Get local  │                │            │      
│        │    file    │   ┌────────┐   │SFTP file to│     │
         │'test2.txt' │───▶ Chnnl2 │───▶   remote   │      
│        │            │   └────────┘   │            │     │
         └────────────┘                └────────────┘      
│                                                         │
 ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 

操作“ A”成功后,应执行操作“ B”。据我所知,我需要在'A'的request-handler-advice-chain中使用int-file:outbound-channel-adapter,但是我不知道如何从中调用'B'。我尝试的部分如下。我尝试使用ExpressionEvaluatingRequestHandlerAdvice,但能够使其工作。有人可以建议在“ A”之后调用“ B”的方法吗?

    <int-file:inbound-channel-adapter
        directory="/local/dir1"
        channel="channel1"
        filename-regex="test./txt">

        <int:poller fixed-rate="60000"/>

    </int-file:inbound-channel-adapter>

    <int:channel id="channel1"></int:channel>


    <int-sftp:outbound-channel-adapter
        session-factory="sessionFactory"
        channel="channel1"
        remote-directory="/remote/dir">

        <int-sftp:request-handler-advice-chain>

            <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
                <property name="successChannel" value="?"></property>
                <property name="onSuccessExpression" value="?"></property>
            </bean>

        </int-sftp:request-handler-advice-chain>

    </int-sftp:outbound-channel-adapter>


    <int-file:inbound-channel-adapter
        directory="/local/dir2"
        channel="channel2"
        filename-regex="test./txt">

    </int-file:inbound-channel-adapter>

    <int:channel id="channel2"></int:channel>

    <int-sftp:outbound-channel-adapter
        session-factory="sessionFactory"
        channel="channel2"
        remote-directory="/remote/dir">
    </int-sftp:outbound-channel-adapter>

1 个答案:

答案 0 :(得分:1)

如果第二部分完全取决于第一部分,则不能在其中使用<int-file:inbound-channel-adapter>。这是流程的开始,只能由轮询者的触发器定期产生事件。当然,有一种方法可以在B流中将其作为auto-startup="false"并在第一个成功后将其启动,但这是否真的是您在寻找...嗯,我什至会说这是不是 操作:发送到<int-sftp:outbound-channel-adapter>的消息与从第二<int-file:inbound-channel-adapter>开始的整个流程之间没有一对一的关系。

我不确定那里到底有什么依赖,但是您需要研究一个简单的服务激活器来调用File.list()或类似的东西,而这些东西实际上已经取决于{{1}的结果}。或真正考虑只使用控制总线来ExpressionEvaluatingRequestHandlerAdvice start()https://docs.spring.io/spring-integration/docs/current/reference/html/system-management-chapter.html#control-bus