引起:java.lang.IllegalArgumentException:使用readLock = idempotent时必须配置IdempotentRepository

时间:2017-05-17 13:55:01

标签: apache-camel hazelcast

我需要在集群环境中完全实现idempotentRepository。 我目前的实现如下,它是为了实现idempotentRepository

而抛出错误
<route id="request" >
                <from uri="file:someFolderLocation?readLock=idempotent&amp;readLockRemoveOnCommit=true"/>
               <to uri="file: someOtherFolderLocation "/>
  

我在集群环境中使用camel并想使用   我的文件消费者端点上的readlock。唯一的群集安全readlock   是幂等的重锁,但这需要一个   要在文件uri上设置的idempotentRepository。

Caused by: java.lang.IllegalArgumentException: IdempotentRepository must be configured when using readLock=idempotent
       at org.apache.camel.component.file.GenericFileEndpoint.doStart(GenericFileEndpoint.java:1328)
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
       at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3269)
       at org.apache.camel.impl.DefaultCamelContext.doAddService(DefaultCamelContext.java:1243)
       at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1204)
       at org.apache.camel.impl.DefaultCamelContext.addService(DefaultCamelContext.java:1200)
       at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:584)
       ... 40 more

请建议。

3 个答案:

答案 0 :(得分:1)

如果您有共享文件系统,可以使用FileIdempotentRepository,希望它适合您。

readLockRemoveOnCommit = true - 此选项允许指定在处理文件成功和提交时是否从idempotent存储库中删除文件名条目。

readLockRemoveOnRollback = true - 此选项允许指定在处理文件失败并发生回滚时是否从idempotent存储库中删除文件名条目。

以下是FileIdempotentRepository的实现

<bean id="myFileStore" class="org.apache.camel.processor.idempotent.FileIdempotentRepository"> 
               <property name="fileStore" value="/shared/myFileStore.txt"/> 
               <property name="maxFileStoreSize" value="512000000"/> 
               <property name="cacheSize" value="100000"/> 
    </bean>
        <camelContext xmlns="http://camel.apache.org/schema/spring">
           <route id="request" >
                <from uri="file:someFolderLocation?readLock=idempotent&amp;idempotentRepository=#myFileStore&amp;readLockRemoveOnCommit=true&amp;readLockRemoveOnRollback=true/>
                <to uri="file: someOtherFolderLocation "/>
           </route>
         </camelContext>

答案 1 :(得分:0)

有关于http://camel.apache.org/file2.html

的文档

请阅读部分:

  • 使用基于文件的幂等存储库(可能在大多数集群中不起作用,因为它需要一些共享文件系统,如nfs / gluster)
  • 使用基于JPA的幂等存储库(可以满足您的要求)

答案 2 :(得分:0)

HazelcastIdempotentRepository是在集群环境中实现共享文件系统的最佳方式之一。

骆驼路线:

<from uri="file:///var/opt/irs/message?delete=true&amp;readLock=idempotent&amp;idempotentRepository=#idempotentRepo&amp;readLockLoggingLevel=WARN&amp;shuffle=true&amp;delay=5000" />
<to uri="send.file" />

w.r.t要求,配置 readLockRemoveOnCommit = true,并且在camel路由中读取readLockRemoveOnRollback = true。

随机对文件进行排序,以减少多个节点尝试访问同一文件的可能性。

IdempotentRepository Bean:

这个bean定义了一个基于hazelcast的Camel幂等存储库,它确保当同一个inputendpoint在多个服务器上运行时,只有一个文件端点收集文件。

     @Autowired
    @Qualifier("hazelcastRepo")
    private HazelcastInstance hazelcastInstance;


        @Bean(name = "idempotentRepo")
        public IdempotentRepository<String> myIdempotentRepo() {

            return new HazelcastIdempotentRepository(hazelcastInstance, "hazelMap");
        }

驱逐策略:

为了清理淡褐色,我建议推行策略。它还有很多其他选项来清理Repository。在我的情况下,下面的hazelcast配置非常有效。 在hazelcast-context.xml或hazelcast-default.xml中配置生存时间秒= x秒。

<map name="hazelMap" 
                time-to-live-seconds="60"
                max-idle-seconds="0"
                eviction-policy="LRU"           
                eviction-percentage="0"
                max-size="0"
                min-eviction-check-millis="100"/>

要获得更多信息,我想推荐Camel in Action:Idempotency文档:Idempotency