使用camel-file组件在同一个已安装文件夹上写入多个实例

时间:2015-12-03 06:02:28

标签: apache-camel osgi smb jbossfuse

我们要求使用同时运行的多个camel接口实例写入单个文件。 该文件位于Windows共享文件系统上,该系统已使用SMB安装在JBoss服务器上。

我们使用camel文件组件将每个实例的文件作为本地文件写入。 下面是camel context

中的端点URI
file:/fuse/server/location/proc?fileName=abc.csv&fileExist=Append

当从单个实例发生写入时,文件生成没有问题,但是在多个实例的情况下,它以随机行的方式将垃圾字符添加到文件中。

我们使用 JBoss Fuse 6.0.0 ,界面使用 camel 2.10 版本编写。

如何解决这个问题?这是SMB安装的问题还是接口需要处理它。

1 个答案:

答案 0 :(得分:0)

我已经看过相关camel组件的源代码(https://github.com/apache/camel/tree/master/camel-core/src/main/java/org/apache/camel/component/file)&没有任何内置支持从多个JVM并发访问单个文件。但是,处理来自单个JVM的并发访问。

我认为您有两个基本选项来满足您的要求:

  1. 编写一些代码以支持对单个文件的共享访问。 camel文件组件看起来像是在构建时考虑了扩展,或者您可以创建一个独立组件来执行此操作。
  2. 正如@Namphibian建议使用一些排队系统来序列化您的写入(虽然我认为seda不会起作用,因为它不会跨越JVMS。
  3. 我的解决方案是使用ActiveMQ。应用程序的每个实例都会将消息发送到单个共享队列。然后,一些其他进程将消耗来自MQ&的消息。把它们写到磁盘上。

    使用单个进程消耗所有MQ消息时,不会对文件系统进行并发写入。

    更强大的解决方案是在群集中运行ActiveMQ(可能在每个应用程序实例中都有一个节点)。查看“JMSXGroupID”以防止并发消息消息。