5

我在同一台主机上运行 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 分布式缓存文档中提供的默认值:

<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" />

谢谢

4

1 回答 1

5

我做错了什么,或者当实例位于同一主机上时,是否可以通过多播进行自动发现?

虽然我对 ehcache 不是很熟悉,但我认为这是可能的,他们实际上提供了一个至少做类似事情的示例(每个主机多个节点,尽管只有一个实例):请参阅RMI Distributed中的完整示例部分您提到的缓存文档。

通常,您不能在每个主机上多次打开同一个 TCP 端口(此处为 40001),它绑定到分配它的第一个应用程序/服务(例如,Windows 上确实存在TCP 端口共享之类的东西,但您必须特别说明)。

因此,如果您真的使用它们相同的默认配置,则尝试分配 TCP 端口 40001 的第二个 Tomcat 实例将无法这样做。当然,这应该在 Tomcat 日志中较早的地方体现出来,您是否已经彻底了解过?

只需为一个 Tomcat 实例使用另一个空闲端口即可解决此问题;您可以在上面提到的完整示例的ehcache.xml中看到这一点:端口号从 40001 逐个增加到每个节点的 40006。

于 2009-08-24T14:48:56.663 回答