问题标签 [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.
error-handling - 聚合失败后发送时回滚单个输入文件
我目前正在尝试将一些遗留代码/系统迁移到 Camel。当前系统正在处理队列的大量文件夹,并按顺序处理这些队列中的所有消息,而不是在开始处理下一条消息之前完全处理一条消息的完整流。我们想摆脱这个,这似乎可以用 Camel (由于以前使用 Camel 的经验,我已经是新手了)。只有一个“问题”,我似乎无法获得简单的流程定义。在简化形式的文本中,流程是这样的
- 轮询某个文件夹的文件
- 有些文件需要聚合有些可以直接发送(目前基于文件名,但将来可能基于内容)
- 根据内容中的某个字段聚合文件
- 将文件发送到远程系统
这在快乐的日子场景中效果很好。下一步是添加错误处理。为此,我们有一个重要的要求。输入文件夹中的单个文件可能已被聚合,但在重新发送后未发送出去,因为单个文件最终会出现在错误文件夹中。
这就是问题所在,至少在保持流程简单方面。我提到“至少保持流程简单”的原因是,通过(很多)额外的节点和步骤,我可以实现我想要的(不会发布这个例子,因为这不是我想要的“建议” )。我正在使用的流程是这样的:
使用聚合器时发生的情况是,一旦单个消息进入聚合器节点并被处理,它就会从输入文件夹移动到默认.camel
文件夹(或您指定的任何文件夹)。所以我打开了跟踪级别的日志并开始调查为什么会发生这种情况。实际移动是由GenericFileOnCompletion
which 完成的,而 which 似乎Synchronization
在 UnitOfWork 中被注册为 a 并在与 which 没有任何关系时触发,Exchange
因为AggregateProcessor
似乎制作了交换的副本。
我试过的:
- 将自定义 onCompletion 添加到路由(或全局),但它仅针对原始交换触发
- 添加一个错误处理程序,但它只为聚合的 Exchange 触发
我进行了更多调试,并注意到使用基于我的自定义聚合策略, GroupedExchangeAggregationStrategy
我可以拥有一个新的“聚合”主体,并且单个交换作为List<Exchange
聚合交换中的一个属性。我(我想我)可以在 errorHandler 中使用原始交换的副本列表来解析这些交换中的每一个,并使用对原始位置的引用并将文件从.camel
文件夹移动到文件.error
夹(两个属性都可以从文件中检索端点(所有这些都在一个处理器中,因此我们的流程开发人员隐藏了这个逻辑)
我知道的其他事情:
- 我可以创建自己的处理器来完成聚合器所做的事情,但我不确定我是否可以让原始交换保持“活跃”?
- 我可能需要一些“持久性”(例如用于聚合的 leveldb)才能在系统崩溃中幸存下来
单元测试:能够重现事物
使用 Camel 3.6.0(但也尝试了 2.25.2 以及所有相关(后退)的更改,同样的问题,所以它不是某种回归 ;-)
我不是在寻找代码中的完整解决方案,也会找到有关可能性或不可能性(无法解决的问题)的提示(尽管如果有简单的解决方案,我不介意被提及或将其作为答案;-))
我读过的间接相关的帖子:
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:
- 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
- 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
- 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:
- Is Apache Camel the right choice?
- Is there a better way, in Apache Camel, to navigate a given directory?
- Is it possible, in Apache Camel, to retrieve information about empty directories too?
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 脚本时,我可以在文件中看到消息:打印消息。
apache-camel - Apache骆驼文件组件定期读取文件而不删除或移动文件并且没有幂等性
Usingnoop=true
允许我在路由使用文件后将文件放在同一位置,但它也启用了我不想要的幂等性。(第二条路线将根据其他一些逻辑进行删除,因此我相信第一条路线不应通过非幂等消耗导致无限循环)
我想我可以覆盖文件并使用 idempotentKey${file:name}-${file:modified}
以便在下次轮询时获取该文件,但这仍然意味着额外的写入。或者只是删除和创建相同的文件也应该可以工作,但又不是一个干净的方法。
有没有更好的方法来实现这一点?我在 Camel 文档中找不到它。
编辑:总而言之,我想以预定的方式(比如每 10 分钟)从同一个 repo 中一遍又一遍地读取相同的文件。解决了!- 下面回答。
骆驼版:2.14.1
谢谢!
spring-boot - 为什么骆驼移动文件只有部分数据?
下面是我的代码:
直到上面的代码,一切正常,所有需要的数据都在文件中。当我尝试将文件移动到其他位置时,移动的文件仅包含来自上述数据提取查询的数据。以前的数据不在文件中。这里发生了什么?如何移动添加了所有数据的文件?
移动文件的代码:
如果我不移动文件,我拥有文件中的所有数据
sorting - Camel 2.x 无法识别“preSort”文件组件参数
我们使用 Camel 的 File 组件来接收放置在目录中的文件。URI 类似于:
以前我们没有“preSort=true”参数,并且文件是按随机顺序接收的。
我们添加了这个参数,但我们现在在日志中收到以下错误:
我们使用的 Camel 版本是 2.15.4。File 组件的 2.x 版本的文档指出这是一个有效参数。
java - Apache Camel 文件组件:聚合后的异常应将文件移动到 .error 文件夹
我的目标是当输入文件夹中的两个文件都可用时,将 pdf 和 xml 文件从输入文件夹移动到输出文件夹。如果一个文件不可用,它应该重试几次,然后将文件移动到 .error 文件夹。
我注意到 File 组件的错误处理似乎受到聚合器的影响,我不知道具体如何:
聚合后抛出异常时,File 组件将文件移动到 .done 文件夹而不是 .error 文件夹,参见代码中的 (2)。但是,在聚合之前抛出异常时,它会按预期工作,请参见 (1)。
我的问题是:
- 使(2)工作缺少什么?
- 是否可以在不引发异常的情况下实现相同的目标?有discardOnCompletionTimeout选项,但这对我也不起作用。
pom.xml:
apache-camel - 在 Spring Camel 文件组件中设置自定义 processStrategy 会抛出找不到合适的属性设置器:processStrategy
我正在尝试在 Camel 2.23.2 中设置自定义 processStrategy。我尝试了几种方法从processStrategy uri 参数中引用它,但我总是得到这个异常:
路线定义
引用它的正确方法是什么?
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)