我有一个复制的缓存运行在许多也运行 OSB 的 weblogic 节点上。缓存以服务器作为启动类启动。它有一个非常简单的对象缓存,可以通过 boolean 属性“可用”简单地跟踪它们是否正在使用。
我从 OSB 向同一个类发出 java 标注,它使用将对象标记为不可用的处理器在缓存上调用“调用”,然后运行 Thread.sleep(31000)。这是我稍后要添加的一些冗长处理的占位符。
我想要发生的是,如果 invoke() 调用花费的时间太长,进程应该超时并返回或抛出异常。所以我一直在尝试配置 30000 毫秒的请求超时来测试这个。不幸的是,我不知道如何让这个超时发生。
我试过:
将处理器包装在 PriorityProcessor 中并在 invoke() 之前调用 setRequestTimeout(30000)
正在添加
<request-timeout
>30000</request-timeout
> 至<replicated-scheme/
> 缓存配置中的元素正在添加
<tasktimeout
>30000</tasktimeout
> 至<replicated-scheme/
> 缓存配置中的元素正在添加
<guardian-timeout
>30000</guardian-timeout
> 至<replicated-scheme/
> 缓存配置中的元素创建 tangosol-coherence-override.xml 并添加监护人超时
<init-param
> 到<service
> 元素的“类型”与缓存配置中的服务“名称”匹配将 sleep() 调用更改为 Thread.sleep(310000) 只是为了查看是否有任何开箱即用的默认值会在 5 分钟后启动。
这些都不会导致任何类型的超时,处理器只是简单地 hibernate 了我告诉它的时间,然后毫无错误地返回。
有没有人以前做过类似的事情,可以给我一些建议吗?将不胜感激。
谢谢
詹姆斯
最佳答案
好的,在 Tim Middleton 的帮助下,我得到了答案.
基本上复制缓存不支持超时,事实证明这对我的系统来说不是一个合适的选择!
解决方法是:
- 切换到
<distributed-cache
> 缓存配置中的方案。 - 添加
<thread-count
> 使用数字 > 1 的方案元素(我选择了 10,但这只是您想要支持的并发实例数)。 - 使用 PriorityProcessor在调用 invoke() 之前包装 EntryProcessor 并使用 setRequestTimeoutMillis() 设置超时。 (请注意,这是我尝试的第一件事,但事实证明使用了错误的缓存类型)
关于java - 甲骨文一致性 : How to set the timeout on an invoke call in a replicated cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10167918/