Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache camel 完成一次汇总后的交换_Apache Camel - Fatal编程技术网

Apache camel 完成一次汇总后的交换

Apache camel 完成一次汇总后的交换,apache-camel,Apache Camel,我正在从兔子那里提取信息并聚合它们。我注意到,即使使用autoAck=false,消息在聚合后也会立即被确认。这意味着,如果进程崩溃,消息将不会重新排队等待重试 我插入了leveldb java db作为聚合repo,解决了这个问题,因为我认为它只有在聚合并存储在repo中后才会确认?老实说,基于它的活动和C版本的问题,级别db并不能让我感到舒服,我想我可以将它切换到SQL repo 所以。问题是,我是否可以做些什么,使Camel只在聚合消息完成其旅程后确认交换消息?聚合之后,我的下一步是简单地

我正在从兔子那里提取信息并聚合它们。我注意到,即使使用autoAck=false,消息在聚合后也会立即被确认。这意味着,如果进程崩溃,消息将不会重新排队等待重试

我插入了leveldb java db作为聚合repo,解决了这个问题,因为我认为它只有在聚合并存储在repo中后才会确认?老实说,基于它的活动和C版本的问题,级别db并不能让我感到舒服,我想我可以将它切换到SQL repo


所以。问题是,我是否可以做些什么,使Camel只在聚合消息完成其旅程后确认交换消息?聚合之后,我的下一步是简单地写入磁盘

也就是说,聚合器是一个有状态的EIP。因此,传入的消息被交给聚合器,然后继续,因此处理该消息的兔子消费者被完成并确认

正如您所说,您需要插入一个持久聚合存储库


由于您的最后一步是写入磁盘,我将重新设计,以便您从rabbit接收每条消息并首先写入磁盘,然后从磁盘->聚合->磁盘执行另一个操作。

re:disk方法。当然我也会有同样的问题。它将在聚合中移动文件一次,如果失败,我将遇到问题。我不能丢失任何消息。听起来我需要使用持久存储…但是leveldb和hawtdb看起来还不够严肃。真的很丢脸…从队列中消费并且只在批处理后进行确认应该是很繁琐的,而且很容易手动编写。还有其他想法吗?使用普通文件比使用leveldb存储更好,因为普通文件更易于管理。正如您所说,您需要在以后存储在文件中。因此,在这种情况下,我根本不会使用存储库吗?rmq->disk1->聚合器->disk2。我想我是在试图理解,在disk1阶段,当文件到达聚合器时,使用者会移动文件…所以我仍然处于相同的位置。如果系统崩溃…正在聚合的文件将丢失,文件将被移动到存档,我将必须确定是什么。避免agg repo,只使用这些文件。磁盘上的消息是安全的,将文件移回文件夹比从rabbitmq重新提交消息要容易得多。因此,实际上我认为我的理解是,这并没有提供我所需要的容错能力。我很高兴首先从RMQ写入磁盘。但我的聚合要求(您之前回答的20k限制文件)需要可靠且可自我恢复。听起来就像你说的,提交到聚合器时的ack ro RMQ,虽然是设计上的,但确实会扼杀对我的用例的支持。如果在聚合完成并写入消息之前没有确认un,系统可能会停止运行,rabbit会自动再次提供这些消息。