如何获得可增量索引 - 即在RouteBuilder的循环()中使用?
问题描述:
问:如何能够获得递增的指数 - 即,在RouteBuilder循环()过程中使用 - 这样反复呼吁“直接:thingC”,将“过程”后续元素(在ArrayList中) ?如何获得可增量索引 - 即在RouteBuilder的循环()中使用?
这里是配置()方法...
private final org.apache.camel.Processor proc1 = new Processor1();
private static final List<String> searchList = Arrays.asList("AA", "BB");
private static final int z = searchList.size();
private static int x = 0;
//***idea is to both elements using an index during the "loop".... Not working....
@Override
public void configure() throws Exception {
from("timer://foo?fixedRate=true&period=" + 5000) //5 seconds...
.to("direct:thingB");
from("direct:thingB")
.log("---------------------- (from(\"direct:thingB\"))... ----------x=" + x)
.loop(searchList.size()).to("direct:thingC");
from("direct:thingC")
.log("---------------------- (from(\"direct:thingC\"))... ----------searchList.get(" + x++ + ")=" + searchList.get(x));
}
日志输出如下所示(指数不递增:总是选择相同的元件)... :-(
2017-09-01 16:13:19,142 | INFO | 43 - timer://foo | route15 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:19,142 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
2017-09-01 16:13:19,143 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
2017-09-01 16:13:24,141 | INFO | 43 - timer://foo | route15 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:24,141 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
2017-09-01 16:13:24,142 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=BB
我们的目标是 - 有 - 这样的输出......
2017-09-01 16:13:19,142 | INFO | 43 - timer://foo | route15 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:19,142 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=AA
2017-09-01 16:13:19,143 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(1)=BB
2017-09-01 16:13:24,141 | INFO | 43 - timer://foo | route15 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingB"))... ----------x=0
2017-09-01 16:13:24,141 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(0)=AA
2017-09-01 16:13:24,142 | INFO | 43 - timer://foo | route16 | 232 - org.apache.camel.camel-core - 2.17.0.redhat-630187 | ---------------------- (from("direct:thingC"))... ----------searchList.get(1)=BB
解决方案:按亚历山德罗的建议,下面
private final String s = "AA,BB";
@Override
public void configure() throws Exception {
from("timer://foo?fixedRate=true&period=" + 5000) //5 seconds...
.setBody(constant(s))
.to("direct:thingB")
from("direct:thingB")
.split().tokenize(",")
.to("direct:thingC");
from("direct:thingC")
.log("body=" + body()); //note: this value looks like simple{AA}
}
答
不要使用loop。从文档:
该循环允许多次处理消息,可能以不同的方式进行每次迭代。主要在测试过程中有用
默认模式
通知默认情况下,循环使用整个循环中的相同交换。所以,既然你要处理的东西单一的元素,你可以“循环”上,将其设置为体,并使用split而不是从上一次迭代的结果将用于下一
。
from("timer://foo?fixedRate=true&period=" + 5000) //5 seconds...
setBody(searchList)
.to("direct:thingB");
from("direct:thingB")
.split()
.simple("${body}")
.log("This is element: ${body} [Element number ${exchangeProperties.CamelSplitIndex} of ${exchangeProperties.CamelSplitSize} total elements]")
.end()
分配器将“破发”的List
成单件和过程都在一个循环。
通常,如果输入或输出数据,请避免使用static
字段。在这种情况下,最好将它们设置为主体,例如使用设置所需数据的Processor
bean。
谢谢你亚历山德罗。我改变了使用上面的“split()”函数。顺便说一句,我将如何从“简单的{AA}”表达式中提取“AA”字符串? thx,再次! – sairn