如何在spring spring和spring集成中从itemWriter编写输出通道?

时间:2015-04-26 10:50:22

标签: spring ftp spring-integration

首先感谢关注,我结合了弹簧批量和弹簧集成,我定义了一个作业流程并从ftp适配器检索文件并发送到jobChannel,并使用spring批处理它,我想写入输出通道并消耗处理后的频道,我的代码是:

     <int-ftp:outbound-gateway id="gatewayGET"
                                  local-directory-expression="'./backup/' +#remoteDirectory"
                                  session-factory="ftpSessionFactory"
                                  request-channel="toGetChannel"
                                  reply-channel="toProcessChannel"
                                  command="get"
                                  temporary-file-suffix=".writing"
                                  command-options="-P"
                                  expression="payload.remoteDirectory + '/' + payload.filename"/>
        <int:channel id="toProcessChannel">
            <int:interceptors>
                <int:wire-tap channel="logger2"/>
            </int:interceptors>
        </int:channel>
    <int:channel id="outboundJobRequestChannel"/>
    <int:channel id="replyJobChannel"/>
   <service-activator input-channel="jobLaunchReplyChannel"/>
 <int:transformer input-channel="toProcessChannel" output-channel="outboundJobRequestChannel">
        <bean class="ir.isc.macna.configuration.FileMessageToJobRequest">
            <property name="fileParameterName" value="fileName"/>
        </bean>
    </int:transformer>
    <batch-int:job-launching-gateway request-channel="outboundJobRequestChannel"
                                     reply-channel="jobLaunchReplyChannel"/>

我的编剧代码是:

@Component
@StepScope
public class MacnaFileWriter implements ChunkMessageChannelItemWriter<FileInfo> {

    @Autowired
    @Qualifier("replyJobChannel")
    private MessageChannel messageChannel;
    @Override
    public void write(List<? extends FileInfo> list) throws Exception {

       // send Message to replyJobChannel channel with Send method
    }
}

并使用ftp adapter在服务器上写入文件:

<int-ftp:outbound-gateway session-factory="ftpSessionFactory"
                              request-channel="replyJob"
                              command="mput"
                              auto-create-directory="true"
                              expression="payload"
                              remote-directory-expression="payload.remoteDirectory + '/' + payload.filename + '.out'"
                              reply-channel="output"/>

这是运行批处理作业和消费结果的标准方法吗?

1 个答案:

答案 0 :(得分:1)

MessageChannelsend方法。为此,您可以使用MessageBuilderMessage<?>创建payload

由于它只是<channel>,因此与其他任何MessageChannel消费没有区别。标准方式定义了这样的消费者:

<service-activator input-channel="jobLaunchReplyChannel"/>

但是,如果此频道特定于jobLaunchReplyChannel<batch-int:job-launching-gateway>类)的结果,则不清楚为什么要向JobLaunchingGateway发送消息:

jobExecution = this.jobLaunchingMessageHandler.launch(jobLaunchRequest);

因此,jobExecution已发送到jobLaunchReplyChannel

请参阅Spring Batch Integration文档。

也许您需要AsyncItemWriterChunkMessageChannelItemWriter