想知道如何将JAXBElement传递给Camel路由,该路由从通过Camel Route加载的Spring批处理读取的批处理文件的每一行处理。
下面给出的代码片段使用customerWriter方法调用JMSTemplate将消息写入Queue。相反,我需要将消息路由到另一个Camel路由。
当前: CamelRoute - > ReadFile - > Spring Batch - >处理每一行 - >队列
预期: CamelRoute - > ReadFile - > Spring Batch - >处理每一行 - >骆驼路线
Camel Route读取文件:
@Override
public void configure() {
String fromUri = batchLoadPath + "?" + batchFileOptions;
from(fromUri).process(new Processor() {
public void process(Exchange msg) {
File file = msg.getIn().getBody(File.class);
String fileName = file.getAbsolutePath();
try {
JobParameters jobParameters = new JobParametersBuilder().addString("input.file.name", fileName).addDate("dateTime", new Date()).toJobParameters();
jobLauncher.run(importCustomerJob, jobParameters);
} catch (Exception e) {
log.error(Process file encountered error:" + e.getMessage(), e);
}
}
})
.to("log:EndBatch");
批量配置:
@Bean
public JmsItemWriter<String> customerWriter() {
JmsItemWriter<String> writer = new JmsItemWriter<String>();
writer.setJmsTemplate(jmsTemplate);
return writer;
}
public Job importCustomerJob(JobCompletionNotificationListener listener, JobBuilderFactory jobBuilderFactory, Step step1) {
JobBuilder builder = jobBuilderFactory.get("importCustomerJob");
builder.incrementer(new RunIdIncrementer());
builder.listener(listener);
JobFlowBuilder jfb = builder.flow(step1);
jfb.end();
Job job = jfb.build().build();
return job;
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory) {
// Read chunk of 10 records and writing those as messages to queue
return stepBuilderFactory.get("step1")
.<Customer, String>chunk(10)
.reader(customerReader())
.faultTolerant()
.skipPolicy(fileVerificationSkipper())
.processor(customerItemProcessor())
.writer(customerWriter())
.listener(customerReader())
.build();
}
批处理器:
public class CustomerItemProcessor implements ItemProcessor<Customer, String> {
@Autowired
JaxbUtil jaxbUtil;
public String process(Customer item) throws Exception {
// Mapping code goes here
JAXBElement<CustomerX> mobj = customerFactory.createCustomerX(cp);
return jaxbUtil.objectToXml(mobj);
}
}
答案 0 :(得分:0)
从Camel的角度来看,要调用另一个Camel路由,只需添加.to()
语句即可。例如,要同步调用内存中路由,可以使用direct:
。
from(fromUri).process(new Processor() {
public void process(Exchange msg) {
... your processor impl
}
})
.to("direct:yourOtherRoute")
.to("log:EndBatch");
from("direct:yourOtherRoute")
...
要将处理器的结果传递给下一个路由,处理器必须将此结果设置为Exchange正文。
答案 1 :(得分:0)
感谢您的建议@Burki和@Roman Vottner。这是我修改过的代码,它起作用了。
解决方案:
在 Batch Config 中添加了一个编写器方法,并将其调用而不是JMSWriter
@Bean
public CamelItemWriter<String> customerCamelWriter() {
ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
CamelItemWriter<String> writer = new CamelItemWriter<String>(producerTemplate, "direct:process");
return writer;
}
@Bean
public Step step1(StepBuilderFactory stepBuilderFactory) {
// Read chunk of 10 records and writing those as messages to CAS.TRF.MDM queue
return stepBuilderFactory.get("step1")
.<Customer, String>chunk(10)
.reader(customerReader())
.faultTolerant()
.skipPolicy(fileVerificationSkipper())
.processor(customerItemProcessor())
.writer(customerCamelWriter())
.listener(customerReader())
.build();
}