2014-10-19 108 views
2

从编程的角度来看,我有一个非常简单的商业案例。然而,我无法弄清楚如何使用Apache Camel来实现它...嗯,我有2个JMS队列:一个接收命令,另一个 - 存储大量消息,这些消息应该分批传递给外部系统1000或更少。Apache Camel:如何使用来自两个或多个JMS队列的消息

这里是概念消息交换算法:

  1. 当在第一JMS队列接收一命令消息我制备XML 消息
  2. 发送XML消息到外部SOAP的Web服务以获得usertoken
  3. 使用usertoken,准备另一个XML消息并将其发送到REST服务以获取jobToken
  4. loop:
    4.1。从第二个JMS队列中集中消息,批量为1000,在超时时停止聚合
    4.2。对于每批次,将其转换为CSV文件
    4.3。通过HTTP发送csv发布到REST服务
    4.4。保留分配给每个批次
  5. 使用jobtoken准备XML信息并发送至REST服务使用各批次的batchtoken检查执行状态通过XML消息REST服务

在注视以提交批

  • batchtoken骆驼我可以创建一个示例项目,我可以模拟出交换1-3,5:

      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队列中的消息?

  • 回答

    1

    这并不意味着我作为单一骆驼路线的一个非常好的用例。我认为你应该在POJO中实现主要功能并使用Camels Bean Integration来消费和生成消息。这将导致更容易维护代码,并且更容易实现异常处理。

    https://camel.apache.org/pojo-consuming.html

    +0

    经与bean实现的整个过程的逻辑,然后下一个问题在这个项目中使用骆驼的投入。 Whell ...我只是在学习,而@consume注解只是注册一个有效的消费者,我在寻找的是开始在某个信号上使用队列而不是onMessage事件的解决方案。不过,我很欣赏你的回答。 – Seego 2014-10-21 08:05:24

    相关问题