我在同一台主机上运行了2个tomcat实例。每个实例都运行相同的Web应用程序,该应用程序尝试通过RMI复制来传递一些ehcache缓存。我在ehcache中使用自动发现配置,因此我不必明确定义哪些是主机,哪些是我想要复制的高速缓存。 ehcache实例无法找到彼此并进行通信:
DEBUG (RMIBootstrapCacheLoader.java:211) - cache peers: []
DEBUG (RMIBootstrapCacheLoader.java:133) - Empty list of cache peers for cache org.hibernate.cache.UpdateTimestampsCache. No cache peer to bootstrap from.
如果我尝试同样的事情,但这次在一个单独的主机(盒子)上运行每个tomcat实例,那么一切都像魅力一样。
我做错了什么,或者当实例位于同一主机上时,是否可以通过多播进行自动发现?
我的配置使用RMI Distributed Caching documentation中显示的默认值:
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32"/>
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="port=40001, socketTimeoutMillis=2000"/>
在我要复制的每个缓存区域内,我有:
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="asynchronousReplicationIntervalMillis=500 " />
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory" />
感谢
答案 0 :(得分:5)
我做错了什么,或者不是 可以通过多播进行自动发现 当实例相同时 主机?
虽然我对ehcache并不熟悉,但我认为这是可能的,事实上他们提供了一个至少做类似事情的例子(每个主机有多个节点,但只有一个实例):参见部分您提到的RMI Distributed Caching文档中的完整示例。
通常你不能在每个主机上多次打开相同的TCP端口(这里是40001),它被绑定到第一个分配它的应用程序/服务(例如,在Windows上存在TCP Port Sharing之类的东西,但是你必须具体说明这一点。
因此,如果您确实使用相同的默认配置,则尝试分配TCP端口40001的第二个Tomcat实例将无法执行此操作。当然,这应该在Tomcat日志的早期某个地方表现出来,你已经看过了吗?
为一个Tomcat实例使用另一个空闲端口应该可以解决问题;您可以在上面提到的完整示例的ehcache.xml's内看到此操作:端口号从40001逐个增加到每个节点40006。