Apache camel ApacheCamel:如何使用来自两个或多个JMS队列的消息

Apache camel ApacheCamel:如何使用来自两个或多个JMS队列的消息,apache-camel,Apache Camel,从编程的角度来看,我有一个非常简单的商业案例。但是,我不知道如何使用ApacheCamel实现它。。。好的,我有两个JMS队列:一个用于接收命令,另一个用于存储大量消息,这些消息应该以1000个或更少的批传递到外部系统 以下是消息交换算法的概念: 在第一个JMS队列中收到命令消息后,我准备XML 信息 将XML消息发送到外部SOAP Web服务以获取usertoken 使用usertoken,准备另一条XML消息并将其发送到REST服务以获取jobToken 循环: 4.1. 将来自第二个JMS

从编程的角度来看,我有一个非常简单的商业案例。但是,我不知道如何使用ApacheCamel实现它。。。好的,我有两个JMS队列:一个用于接收命令,另一个用于存储大量消息,这些消息应该以1000个或更少的批传递到外部系统

以下是消息交换算法的概念:

  • 在第一个JMS队列中收到命令消息后,我准备XML 信息
  • 将XML消息发送到外部SOAP Web服务以获取usertoken
  • 使用usertoken,准备另一条XML消息并将其发送到REST服务以获取jobToken
  • 循环:
    4.1. 将来自第二个JMS队列的消息分1000批聚合,在超时时停止聚合
    4.2. 对于每个批次,将其转换为CSV文件
    4.3. 通过HTTP Post将csv发送到REST服务
    4.4. 保留分配给每个批次的batchtoken
  • 使用jobtoken准备XML消息并发送到REST服务以提交批处理
  • 使用batchtoken通过发送给REST服务的XML消息检查每个批的执行状态
  • 在查看Camel时,我可以创建一个示例项目,在该项目中,我可以对exchange 1-3、5进行建模:

               from("file:src/data?noop=true")
                    .setHeader("sfUsername", constant("a@fd.com"))
                    .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队列中的消息

    对于单程骆驼路线,这并不是一个很好的用例。我认为您应该在POJO中实现主要功能,并使用Camels Bean集成来消费和生成消息。这将使代码更易于维护,也使异常处理更容易


    请参见

    使用bean实现整个流程逻辑,然后提出在该项目中使用Camel的问题。惠尔。。。我只是在学习,@consume注释只是注册了一个有效的使用者,我所寻找的是一个解决方案,可以根据某个信号而不是onMessage事件开始使用队列。不过,我很感激你的回答。