2017-05-17 29 views
2

我需要在集群环境中完全实现idempotentRepository。 我目前的实现如下,它是为实现idempotentRepository引起:java.lang.IllegalArgumentException:在使用readLock = idempotent时必须配置IdempotentRepository

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

我使用骆驼在集群环境中抛出错误,并希望使用 readlock我的文件消费者端点。唯一的群集安全的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 

请指点。

回答

0

有关于那里提供http://camel.apache.org/file2.html

请仔细阅读部分文档:

  • 使用基于文件幂等资料库(可能不会在大多数集群的工作,因为它需要像NFS一些共享的文件系统/ gluster)
  • 使用JPA基于幂库(可满足您的要求)
+0

感谢您的帮助! –

1

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

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

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

以下是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> 
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 =真和readLockRemoveOnRollback =在骆驼路线真。

通过随机排序文件以减少多个节点尝试访问同一文件的机会。

IdempotentRepository豆:

这个bean定义了基于hazelcast,这确保了文件被当同一inputendpoint超过一台服务器上只运行一个文件端点收集骆驼幂等仓库。

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


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

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

驱逐策略:

清洁hazelcast,我会建议驱逐策略。它还有许多其他选项来清理Repository。在我的情况下,下面的hazelcast配置工作得很好。 在hazelcast-context.xml或hazelcast-default.xml中配置time-to-live-seconds = 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"/> 

为了获得更多的信息,我想推荐骆驼在行动:幂等文件:Idempotency

相关问题