我有一个使用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”的日志,但到目前为止我也没有成功。非常感谢任何帮助。
答案 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" />