我有一个问题,我需要从 MQ 队列接收一系列消息并将其写入文件并使用该文件作为输入启动 spring 批处理作业。现在我正在考虑使用有线 @Autowired JobLauncher jobLauncher 和 @Autowired Job job;
从 MDB 本身启动工作。但我觉得这不是一个好方法,因为 spring batch 可能会创建一个系列线程和 EJB 本身不支持多线程。
还有其他有效的方法吗?我不想使用 quartz 调度程序或其他任何东西,因为它增加了复杂性。 spring batch 本身是否有任何接口(interface)可以在文件进入目录后立即启 Action 业?如果能更好地做到这一点,我们将不胜感激。
谢谢。
最佳答案
- 我有一个问题,我需要从 MQ 队列接收一系列消息并将其写入文件并使用该文件作为输入启动 spring 批处理作业
这样做的一种方法是使用一些 Spring Integration,其中您将有一个文件轮询器,它会轮询一个新文件:
<file:inbound-channel-adapter id="filePoller"
channel="filesAreComing"
directory="file:${input.directory}"
filename-pattern="test*" />
将 file message
( java.io.File ) 调整为 file name
( String ),因为这是 Spring Batch 所需要的。这可以通过 JobLauncher 适配器来完成,它已经可以从 Spring Batch Admin 获得 here :
@ServiceActivator
public JobLaunchRequest adapt(File file) throws NoSuchJobException {
JobParameters jobParameters = new JobParametersBuilder().addString(
"input.file", file.getAbsolutePath()).toJobParameters();
return new JobLaunchRequest(job, jobParameters);
}
将其包装到 JobLaunchRequest
(它只是一个 Job
和 JobParameters
的持有者)并发送此请求 [作为消息]到 JobLaunchingMessageHandler
:
<service-activator input-channel="jobLauncher">
<beans:bean class="org.springframework.batch.integration.launch.JobLaunchingMessageHandler">
<beans:constructor-arg ref="jobLauncher" />
</beans:bean>
</service-activator>
这将启 Action 业。
“input.file”是一个在运行时绑定(bind)的参数(因此 #{...} ):
<bean id="reader" class="org.springframework.batch.item.file.FlatFileItemReader" scope="step">
<property name="resource" value="#{jobParameters[input.file]}" />
... line mapper and other props
</bean>
关于java - 启动 Spring 批处理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7099543/