我想在下面的代码/配置中放置一个钩子,以便能够发现JobInstanceAlreadyCompleteException
,然后通过电子邮件向生产支持团队发送此消息。
我在Spring Batch中尝试过JobExecutionListener#beforeJob()
方法,但JobInstanceAlreadyCompleteException
在作业执行之前就已经发生了。
我正在使用文档中的Spring Batch Integration配置:
<int:channel id="inboundFileChannel"/>
<int:channel id="outboundJobRequestChannel"/>
<int:channel id="jobLaunchReplyChannel"/>
<int-file:inbound-channel-adapter id="filePoller"
channel="inboundFileChannel"
directory="file:/tmp/myfiles/"
filename-pattern="*.csv">
<int:poller fixed-rate="1000"/>
</int-file:inbound-channel-adapter>
<int:transformer input-channel="inboundFileChannel"
output-channel="outboundJobRequestChannel">
<bean class="io.spring.sbi.FileMessageToJobRequest">
<property name="job" ref="personJob"/>
<property name="fileParameterName" value="input.file.name"/>
</bean>
</int:transformer>
如果出现与作业参数相同的CSV文件名,我想处理JobInstanceAlreadyCompleteException
。我是否延长org.springframework.integration.handler.LoggingHandler
?
我注意到该类正在报告错误:
ERROR org.springframework.integration.handler.LoggingHandler - org.springframework.messaging.MessageHandlingException: org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={input.file.name=C:\Users\csv\file2015.csv}. If you want to run this job again, change the parameters.
答案 0 :(得分:0)
ERROR org.springframework.integration.handler.LoggingHandler
是通过您errorChannel
上<poller>
的默认<int-file:inbound-channel-adapter>
完成的。
因此,要手动处理,您只需指定自己的error-channel
即可继续发送电子邮件:
<int-file:inbound-channel-adapter>
<int:poller fixed-rate="1000" error-channel="sendErrorToEmailChannel"/>
</int-file:inbound-channel-adapter>
<int-mail:outbound-channel-adapter id="sendErrorToEmailChannel"/>
当然,在通过电子邮件发送ti之前,您必须进行一些ErrorMessage
转换,但这已经是目标业务逻辑实现的详细信息。