我需要在集群环境中完全实现idempotentRepository。 我目前的实现如下,它是为了实现idempotentRepository
而抛出错误<route id="request" >
<from uri="file:someFolderLocation?readLock=idempotent&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
请建议。
答案 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&idempotentRepository=#myFileStore&readLockRemoveOnCommit=true&readLockRemoveOnRollback=true/>
<to uri="file: someOtherFolderLocation "/>
</route>
</camelContext>
答案 1 :(得分:0)
有关于http://camel.apache.org/file2.html
的文档请阅读部分:
答案 2 :(得分:0)
HazelcastIdempotentRepository是在集群环境中实现共享文件系统的最佳方式之一。
骆驼路线:
<from uri="file:///var/opt/irs/message?delete=true&readLock=idempotent&idempotentRepository=#idempotentRepo&readLockLoggingLevel=WARN&shuffle=true&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