2
从编程的角度来看,我有一个非常简单的商业案例。然而,我无法弄清楚如何使用Apache Camel来实现它...嗯,我有2个JMS队列:一个接收命令,另一个 - 存储大量消息,这些消息应该分批传递给外部系统1000或更少。Apache Camel:如何使用来自两个或多个JMS队列的消息
这里是概念消息交换算法:
- 当在第一JMS队列接收一命令消息我制备XML 消息
- 发送XML消息到外部SOAP的Web服务以获得usertoken
- 使用usertoken,准备另一个XML消息并将其发送到REST服务以获取jobToken
- loop:
4.1。从第二个JMS队列中集中消息,批量为1000,在超时时停止聚合
4.2。对于每批次,将其转换为CSV文件
4.3。通过HTTP发送csv发布到REST服务
4.4。保留分配给每个批次 - 使用jobtoken准备XML信息并发送至REST服务使用各批次的batchtoken检查执行状态通过XML消息REST服务
在注视以提交批
from("file:src/data?noop=true")
.setHeader("sfUsername", constant("[email protected]"))
.setHeader("sfPwd", constant("12345"))
.to("velocity:com/eip/vm/bulkPreLogin.vm?contentCache=false")
.setHeader(Exchange.CONTENT_TYPE, constant("text/xml; charset=UTF-8"))
.setHeader("SOAPAction", constant("login"))
.setHeader("CamelHttpMethod", constant("POST"))
.to("http4://bulklogin") // send login
.to("xslt:com/eip/xslt/bulkLogin.xsl") //xslt transformation to retrieve userToken
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
String body = (String) exchange.getIn().getBody();
String[] bodyParts = body.split(",");
exchange.getProperties().put("userToken", bodyParts[0]);
.....
}
})
.to("velocity:com/eip/vm/jobInsertTeamOppStart.vm")
.setHeader(Exchange.CONTENT_TYPE, constant("application/xml; charset=UTF-8"))
.setHeader("X-Session", property("userToken"))
.setHeader("CamelHttpMethod", constant("POST"))
.to("http4://scheduleJob") //schedule job
.to("xslt:com//eip/xslt/jobInfoTransform.xsl")
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
String body = (String) exchange.getIn().getBody();
exchange.getProperties().put("jobToken",body.trim());
}
})
//add batches in a loop ???
.to("velocity:com/eip/vm/jobInsertTeamOppEnd.vm")
.setHeader(Exchange.HTTP_URI, simple("https://na15.com/services/async/job/${property.jobToken}"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/xml; charset=UTF-8"))
.setHeader("X-ID-Session", property("userToken"))
.setHeader("CamelHttpMethod", constant("POST"))
.to("http4://closeJob") //schedule job
//check batch?
.bean(new SomeBean());
所以,我的问题是: 我怎么能读取我的第二个JMS队列中的消息?
经与bean实现的整个过程的逻辑,然后下一个问题在这个项目中使用骆驼的投入。 Whell ...我只是在学习,而@consume注解只是注册一个有效的消费者,我在寻找的是开始在某个信号上使用队列而不是onMessage事件的解决方案。不过,我很欣赏你的回答。 – Seego 2014-10-21 08:05:24