我在同一台主机上运行了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" />
谢谢
解决方法:
Am I doing something wrong, or isn’t
autodiscovery via multicast possible
when the instances are on the same
host?
虽然我对ehcache并不熟悉,但我认为这是可能的,事实上他们提供了一个至少做类似事情的例子(每个主机有多个节点,但只有一个实例):请参阅RMI Distributed Caching文档中的完整示例部分你提到过.
通常你不能在每个主机上多次打开相同的TCP端口(这里是40001),它被绑定到第一个分配它的应用程序/服务(例如在Windows上存在像TCP Port Sharing这样的东西,但你必须具体帐户为了那个原因).
因此,如果您确实使用相同的默认配置,则尝试分配TCP端口40001的第二个Tomcat实例将无法执行此操作.当然,这应该在Tomcat日志的早期某个地方显现出来,你已经看过了吗?
只为一个Tomcat实例使用另一个空闲端口就可以解决问题;对于上面提到的完整示例,您可以在ehcache.xml’s中看到此操作:端口号从40001逐个增加到每个节点40006.