java – 同一主机上2个实例之间的ehcache自动发现(通过多播)

我在同一台主机上运行了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.

上一篇:idea配置echache.xml报错Cannot resolve file 'ehcache.xsd'


下一篇:使用Ehcache