- 我有一个问题,我需要从 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>
这将启动这项工作。
"input.file" 是在运行时绑定的参数(因此是 #{...} ):
<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>