我现在已经完成了一些骆驼小项目,但我很难理解的一件事是在骆驼路线消费时如何处理大数据(不适合内存)。
我有一个数据库,其中包含我想要使用camel路由的几GB数据。显然,将所有数据读入内存不是一种选择。
如果我作为一个独立的应用程序执行此操作,我将拥有通过数据分页并将块发送到我的JMS enpoint的代码。我想使用驼峰,因为它提供了一个很好的模式。如果我从文件中消耗,我可以使用streaming()调用。
我也应该使用camel-sql / camel-jdbc / camel-jpa或使用bean从我的数据库中读取。
希望每个人都和我在一起。我对Java DSL比较熟悉,但感谢人们提供的任何帮助/建议。更新:2012年5月2日
所以我有时间玩这个,我认为我实际上在做的是滥用制作人的概念,以便我可以在路线中使用它。
public class MyCustomRouteBuilder extends RouteBuilder {
public void configure(){
from("timer:foo?period=60s").to("mycustomcomponent:TEST");
from("direct:msg").process(new Processor() {
public void process(Exchange ex) throws Exception{
System.out.println("Receiving value" : + ex.getIn().getBody() );
}
}
}
}
我的制作人看起来像以下内容。为清楚起见,我没有包含CustomEndpoint或CustomComponent,因为它似乎只是一个薄的包装器。
public class MyCustomProducer extends DefaultProducer{
Endpoint e;
CamelContext c;
public MyCustomProducer(Endpoint epoint){
super(endpoint)
this.e = epoint;
this.c = e.getCamelContext();
}
public void process(Exchange ex) throws Exceptions{
Endpoint directEndpoint = c.getEndpoint("direct:msg");
ProducerTemplate t = new DefaultProducerTemplate(c);
// Simulate streaming operation / chunking of BIG data.
for (int i=0; i <20 ; i++){
t.start();
String s ="Value " + i ;
t.sendBody(directEndpoint, value)
t.stop();
}
}
}
首先,上面看起来并不是很干净。似乎最简洁的方法是通过我的骆驼路线消耗的预定石英作业填充jms队列(代替direct:msg),以便我可以更灵活地接收我的骆驼中收到的消息大小管道。但是我非常喜欢将基于时间的激活设置为Route的一部分的语义。
有没有人对最佳方法有任何想法。
答案 0 :(得分:1)
根据我的理解,您需要做的就是:
from("jpa:SomeEntity" +
"?consumer.query=select e from SomeEntity e where e.processed = false" +
"&maximumResults=150" +
"&consumeDelete=false")
.to("jms:queue:entities");
maximumResults
定义了每个查询获得的实体数量的限制。
完成实体实例的处理后,您需要设置e.processed = true;
和persist()
,以便不再处理该实体。
一种方法是使用@Consumed
注释:
class SomeEntity {
@Consumed
public void markAsProcessed() {
setProcessed(true);
}
}
另外,您需要注意的是在将实体发送到队列之前如何序列化实体。您可能需要在from和to之间使用 richher 。