问题标签 [camel-file]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
33 浏览

error-handling - 聚合失败后发送时回滚单个输入文件

我目前正在尝试将一些遗留代码/系统迁移到 Camel。当前系统正在处理队列的大量文件夹,并按顺序处理这些队列中的所有消息,而不是在开始处理下一条消息之前完全处理一条消息的完整流。我们想摆脱这个,这似乎可以用 Camel (由于以前使用 Camel 的经验,我已经是新手了)。只有一个“问题”,我似乎无法获得简单的流程定义。在简化形式的文本中,流程是这样的

  • 轮询某个文件夹的文件
  • 有些文件需要聚合有些可以直接发送(目前基于文件名,但将来可能基于内容)
  • 根据内容中的某个字段聚合文件
  • 将文件发送到远程系统

这在快乐的日子场景中效果很好。下一步是添加错误处理。为此,我们有一个重要的要求。输入文件夹中的单个文件可能已被聚合,但在重新发送后未发送出去,因为单个文件最终会出现在错误文件夹中。

这就是问题所在,至少在保持流程简单方面。我提到“至少保持流程简单”的原因是,通过(很多)额外的节点和步骤,我可以实现我想要的(不会发布这个例子,因为这不是我想要的“建议” )。我正在使用的流程是这样的:

使用聚合器时发生的情况是,一旦单个消息进入聚合器节点并被处理,它就会从输入文件夹移动到默认.camel文件夹(或您指定的任何文件夹)。所以我打开了跟踪级别的日志并开始调查为什么会发生这种情况。实际移动是由GenericFileOnCompletionwhich 完成的,而 which 似乎Synchronization在 UnitOfWork 中被注册为 a 并在与 which 没有任何关系时触发,Exchange因为AggregateProcessor似乎制作了交换的副本。

我试过的:

  • 将自定义 onCompletion 添加到路由(或全局),但它仅针对原始交换触发
  • 添加一个错误处理程序,但它只为聚合的 Exchange 触发

我进行了更多调试,并注意到使用基于我的自定义聚合策略, GroupedExchangeAggregationStrategy我可以拥有一个新的“聚合”主体,并且单个交换作为List<Exchange聚合交换中的一个属性。我(我想我)可以在 errorHandler 中使用原始交换的副本列表来解析这些交换中的每一个,并使用对原始位置的引用并将文件从.camel文件夹移动到文件.error夹(两个属性都可以从文件中检索端点(所有这些都在一个处理器中,因此我们的流程开发人员隐藏了这个逻辑)

我知道的其他事情:

  • 我可以创建自己的处理器来完成聚合器所做的事情,但我不确定我是否可以让原始交换保持“活跃”?
  • 我可能需要一些“持久性”(例如用于聚合的 leveldb)才能在系统崩溃中幸存下来

单元测试:能够重现事物

使用 Camel 3.6.0(但也尝试了 2.25.2 以及所有相关(后退)的更改,同样的问题,所以它不是某种回归 ;-)

我不是在寻找代码中的完整解决方案,也会找到有关可能性或不可能性(无法解决的问题)的提示(尽管如果有简单的解决方案,我不介意被提及或将其作为答案;-))

我读过的间接相关的帖子:

0 投票
1 回答
90 浏览

apache-camel - Apache Camel as file explorer

I need a way to show the content of a (remote) directory and, since the main application makes an intensive use of Apache Camel, I would like to rely on Apache Camel once more to accomplish this task.

So, the goal is to have a file explorer view which lists the base directory content (directories and files) and, by clicking on a given directory, the view should be refreshed by showing its content, and so on... a sort of FTP client (e.g. WinSCP, FileZilla, etc.) to let the user navigate a directory, which could be remote or local, depending on the context.

If I had to do it with Apache Camel, I would use:

  • the file component to gather local directories content
  • the sftp component to gather remote directories content

Then, starting from the given base directory, I would use recursive=true to retrieve its full content (so, all files contained by the base directory and all sub-directories). That way, by mapping the result in a tree and keeping it in memory, I would be able to identify the directories structure and show to the user only a specific sub-set of information, depending on its navigation.

However, this approach has at least three side-effects:

  1. since the full structure is immediately retrieved at once, it wouldn't be possible to lazy load the given node, accordingly to the user navigation
  2. at the same way, it would be necessary to keep the full structure in memory, even if the user is viewing a leaf containing, for instance, a single file
  3. it wouldn't be possible to show empty directories... as far as I know, in fact, Camel reads files only so, in case a directory /D contains the file F.txt and the empty directory /E, the Camel component would return /D/F.txt but not /D/E, which is a directory

Points 1 and 2 could probably be fixed by specifying a maxDepth=2, in order to identify all files and all directories of the current level... but, again, considering the following structure:

The file component, starting from root and having recursive=true and maxDepth=2, would only return

  • /root/file1.txt
  • /root/sub-dir-2/file2.txt

(no sub-dir-1, which doesn't directly contains files).

So, my questions are:

  1. Is Apache Camel the right choice?
  2. Is there a better way, in Apache Camel, to navigate a given directory?
  3. Is it possible, in Apache Camel, to retrieve information about empty directories too?
0 投票
0 回答
174 浏览

java - 独立的 Apache Camel JAR 无法读取文件内容

我编写了一个小型 Camel 应用程序(https://github.com/bhushantimilsina/camel-simple-app),它从收件箱目录读取文件,调用处理器更改其大小写并将输出写入发件箱目录中的文件。当我运行主类(使用 IDE 或使用 run.cmd 脚本)时,一切都按预期工作,但是当我使用可执行 JAR 运行应用程序时,只有消息内容为空。

为了做这个测试,我复制了 \target 中的 \inbox\inputFile.txt 以便输入文件在那里。然后我使用目标目录中的“java -jar camel-simple-app-1.0-jar-with-dependencies.jar”运行 JAR。

作为可执行 JAR 运行时的输出日志:

在日志中,消息:为空。

从 IDE 运行或使用 run.cmd 脚本时,我可以在文件中看到消息:打印消息。

0 投票
1 回答
219 浏览

apache-camel - Apache骆驼文件组件定期读取文件而不删除或移动文件并且没有幂等性

Usingnoop=true允许我在路由使用文件后将文件放在同一位置,但它也启用了我不想要的幂等性。(第二条路线将根据其他一些逻辑进行删除,因此我相信第一条路线不应通过非幂等消耗导致无限循环)

我想我可以覆盖文件并使用 idempotentKey${file:name}-${file:modified}以便在下次轮询时获取该文件,但这仍然意味着额外的写入。或者只是删除和创建相同的文件也应该可以工作,但又不是一个干净的方法。

有没有更好的方法来实现这一点?我在 Camel 文档中找不到它。

编辑:总而言之,我想以预定的方式(比如每 10 分钟)从同一个 repo 中一遍又一遍地读取相同的文件。解决了!- 下面回答。

骆驼版:2.14.1

谢谢!

0 投票
1 回答
40 浏览

spring-boot - 为什么骆驼移动文件只有部分数据?

下面是我的代码:

直到上面的代码,一切正常,所有需要的数据都在文件中。当我尝试将文件移动到其他位置时,移动的文件仅包含来自上述数据提取查询的数据。以前的数据不在文件中。这里发生了什么?如何移动添加了所有数据的文件?

移动文件的代码:

如果我不移动文件,我拥有文件中的所有数据

0 投票
1 回答
58 浏览

sorting - Camel 2.x 无法识别“preSort”文件组件参数

我们使用 Camel 的 File 组件来接收放置在目录中的文件。URI 类似于:

以前我们没有“preSort=true”参数,并且文件是按随机顺序接收的。

我们添加了这个参数,但我们现在在日志中收到以下错误:

我们使用的 Camel 版本是 2.15.4。File 组件的 2.x 版本的文档指出这是一个有效参数。

0 投票
0 回答
99 浏览

java - Apache Camel 文件组件:聚合后的异常应将文件移动到 .error 文件夹

我的目标是当输入文件夹中的两个文件都可用时,将 pdf 和 xml 文件从输入文件夹移动到输出文件夹。如果一个文件不可用,它应该重试几次,然后将文件移动到 .error 文件夹。

我注意到 File 组件的错误处理似乎受到聚合器的影响,我不知道具体如何:

聚合后抛出异常时,File 组件将文件移动到 .done 文件夹而不是 .error 文件夹,参见代码中的 (2)。但是,在聚合之前抛出异常时,它会按预期工作,请参见 (1)。

我的问题是:

  1. 使(2)工作缺少什么?
  2. 是否可以在不引发异常的情况下实现相同的目标?有discardOnCompletionTimeout选项,但这对我也不起作用。

pom.xml:

0 投票
1 回答
33 浏览

apache-camel - 在 Spring Camel 文件组件中设置自定义 processStrategy 会抛出找不到合适的属性设置器:processStrategy

我正在尝试在 Camel 2.23.2 中设置自定义 processStrategy。我尝试了几种方法从processStrategy uri 参数中引用它,但我总是得到这个异常:

路线定义

引用它的正确方法是什么?

0 投票
1 回答
26 浏览

apache-camel - 重新启动使用 File 组件初始化的路由不会再次轮询现有文件

感谢 JMX(Java 控制台),我尝试使用文件组件消费者端点重新启动路由。

我正在使用窃听模式通过其他文件端点记录中间数据转换。在骆驼应用程序第一次启动时,一切都很好,并且输入目录中已经存在的所有文件都被轮询和处理。

但是当我尝试通过 jmx 重新启动路由时,什么也没有发生。我尝试在重新启动路由之前手动删除 .camel 目录 - 我猜是默认的 FileIdempotentRepository 创建的,但徒劳无功。我还尝试使用 MemoryIdempotentRepository 更改 IdempotentRepository 的类型:

即使我在 java 控制台中重新启动路由之前触发了此 MemoryIdempotentRepository 的 clear() 操作,重新启动后也不会从输入目录轮询任何内容。

如果我添加一个文件,它可以工作。如果已经轮询过一次的文件有持久的历史记录,那么一切都会表现得如此。

我想知道使用选项“noop=true”是否会创建一个我无法用 jmx 控制的非托管幂等存储库。

如果为 true,则不会以任何方式移动或删除文件。此选项适用于只读数据或 ETL 类型要求。如果 noop=true,Camel 也会设置 idempotent=true,以避免重复使用相同的文件。

任何想法 ?(我使用的是骆驼核心 2.21)