在Spring批处理作业之后触发Spring Integration Outbound Adapter

时间:2014-07-14 19:47:41

标签: java spring spring-batch spring-integration

我的要求几乎与此处post中描述的要求相同。即,在文件生成器Spring Batch完成后触发Spring Integration程序。我主要在这里使用Spring Integration示例:XML ConfigurationTest。我观察到的是,Test程序将配置文件初始化为ClassPathXmlApplicationContext,然后根据需要设置一些值。忽略配置,程序的关键似乎是以下四行:

final File file = new File(sourceFileName);
final Message<File> message = MessageBuilder.withPayload(file).build();
final MessageChannel inputChannel = ac.getBean("inputChannel", MessageChannel.class);
inputChannel.send(message);

我想知道是否有选项将其移入配置文件本身,因此我不必创建消息或将其从测试程序传递到MessageChannel但是可以启动Spring批处理并在作业完成后观察它调用Outbound SFTP触发器。如果这样做,我的工作大部分都已完成,以便我可以将其作为Spring Batch作业的下一步插入。

如果您注意到入站适配器的示例,我可以使用以下代码行在config file中完成所有这些操作:

<int-sftp:inbound-channel-adapter id="sftpInbondAdapter"
        channel="receiveChannel"
        session-factory="sftpSessionFactory"
        local-directory="file:${inbound.local.directory}"
        remote-directory="${inbound.remote.directory}"
        auto-create-local-directory="true"
        delete-remote-files="false"
        filename-pattern="*.*">
    <int:poller max-messages-per-poll="-1" fixed-rate="1000" />
</int-sftp:inbound-channel-adapter>

<int:channel id="receiveChannel">
    <int:queue/>
</int:channel>

并从test program我可以做如下:

PollableChannel localFileChannel = context.getBean("inboundFileChannel", PollableChannel.class);
System.out.println("Received first file message: " + localFileChannel.receive());

可能是我在这里缺少一些非常基本的东西。我还查看了前一篇文章中调用Tasklet的sample cited here,再次在Tasklet中,用户正在初始化上下文文件,这在我的案例中似乎不是一个好方法,因为我将拥有我的Spring Batch和Spring Integration配置在相同的XML中,看起来像循环调用。

1 个答案:

答案 0 :(得分:0)

您可以使用Messaging Gateway。只需定义POJI并在与批处理作业相同的上下文中将其配置为<gateway/>。将它注入一个tasklet步骤,它将调用该流程。

或者,使用JobLaunchingGateway启动批处理作业,然后在网关完成后执行sftp工作。