camel:设置body并在嵌套循环内转发

时间:2015-01-24 00:01:34

标签: apache-camel

我有一个使用groovy inside transform标签的路由将消息体设置为列表。问题是消息体是在嵌套循环中设置的。一旦设置了消息体,我需要将消息发送到单独的路由,并在循环中执行此操作。我对如何在迭代中完成此操作并不清楚。这就是我现在所拥有的:

    <route id="contentSearch">
        <from uri="direct:contentSearch" />            
        <transform>
            <groovy>
                def endPoint = camelContext.getEndpoint("activemq:contentPageHandler");
                def producer = endPoint.createProducer();
                for(cur in body['type'])
                {
                    ......
                     for(sec in body['section'])
                     {    
                        ........                  
                        def exchange = endPoint.createExchange();
                        exchange.getIn().setBody(contentList);
                        producer.process(exchange);

                     }
                  }

            </groovy>
        </transform>            
    </route>  

根据我的上述情况,我收到了错误:

    The target server failed to respond
    org.apache.http.NoHttpResponseException: The target server failed to respond

我想要达到的溃败是:

    <route id="contentPageHandler">
        <from uri="activemq:contentPageHandler?transacted=true"/>          
        <log message="!!! body:${body}" logName="logContentPageHandler"/>    
    </route>   

我不得不承认,我不确定这里出了什么问题,因为我对骆驼很新。我希望能够在上面的groovy代码中使用名为“logContentPageHandler”的日志,但到目前为止我也没有成功。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

不确定你真正想做什么,但我会尝试从高层次解释。

骆驼中有不同的构造用于不同的事物。变换器的目的是转换并返回有效载荷。然后,您可以使用splitter将消息的各个部分发送到端点。不要使用常规变压器。

我的想法是使用那个常规代码来创建java.util.List个“部分”。

<transform>
 <groovy>
   for(sec in body['section']){
      // create a list..
   }
   return listOfSections;
  </groovy>
</transform>
<split>
 <simple>${body}</simple>
 <to uri="activemq:contentPageHandler"/>
</split>

要在groovy代码中使用日志,您必须创建一个具有预期名称的org.slf4j.Logger对象并使用它。

修改

要真正从groovy变换器发送多条消息,请使用ProducerTemplate触发多条消息。它有多种发送方法(取决于消息交换模式,请查看文档)。未经测试的代码,但应该工作。请注意,您可能不应该多次创建ProducerTemplate。重用单个模板会更好,但这将说明这个概念。

<transform>
        <groovy>
            def producer = camelContext.createProducer();

            for(cur in body['type'])
            {
                ......
                 for(sec in body['section'])
                 {    
                    ........                  
                    producer.sendBody("activemq:contentPageHandler",contentList);

                 }
              }

        </groovy>
    </transform>       

答案 1 :(得分:0)

错误是与同步相关的超时错误。我不得不将“to”标签更改为“inOnly”标签,还必须直接更改“from”标签:

<from uri="direct:contentSearch" /> 

到“来自”activemq

<from uri="activemq:contentSearch?transacted=true" />