2016-03-03 165 views
2

我想在ehcache上启用2节点之间的项目之一的分布式缓存,但我遇到了问题。 我使用的Ehcache核心2.6.11在Java Spring项目Ehcache - 无法获得分布式缓存工作

下面是每个服务器上的

节点我的Ehcache配置的相关部分1

​​

节点2

<cacheManagerPeerProviderFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
    properties=" 
     peerDiscovery=manual, 
     rmiUrls=//node1.mydomain.com:40001/myCache1|//node1.mydomain.com:40001/myCache2"/> 

<cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="port=40002"/> 

当我更新缓存并期望它被复制 - 这里有

03.03.2016 06:44:50 DEBUG [net.sf.ehcache.distribution.RMICacheManagerPeerProvider.lookupRemoteCachePeer():126] Lookup URL //node2.mydomain.com:40002/myCache1 
03.03.2016 06:44:50 WARN [net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue():325] Unable to send message to remote peer. Message was: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
java.rmi.ConnectException: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) 
     at net.sf.ehcache.distribution.RMICachePeer_Stub.send(Unknown Source) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue(RMIAsynchronousCacheReplicator.java:314) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.replicationThreadMain(RMIAsynchronousCacheReplicator.java:127) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.access$000(RMIAsynchronousCacheReplicator.java:58) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator$ReplicationThread.run(RMIAsynchronousCacheReplicator.java:389) 
Caused by: java.net.ConnectException: Connection refused 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at java.net.Socket.connect(Socket.java:538) 
     at java.net.Socket.<init>(Socket.java:434) 
     at java.net.Socket.<init>(Socket.java:211) 
     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) 
     at net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory.createSocket(ConfigurableRMIClientSocketFactory.java:70) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     ... 8 more 

节点2

03.03.2016 06:44:50 DEBUG [net.sf.ehcache.distribution.RMICacheManagerPeerProvider.lookupRemoteCachePeer():126] Lookup URL //node1.mydomain.com:40001/myCache1 
03.03.2016 06:44:50 WARN [net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue():325] Unable to send message to remote peer. Message was: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
java.rmi.ConnectException: Connection refused to host: <node 2 IP Address>; nested exception is: 
     java.net.ConnectException: Connection refused 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
     at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
     at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
     at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130) 
     at net.sf.ehcache.distribution.RMICachePeer_Stub.send(Unknown Source) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.writeReplicationQueue(RMIAsynchronousCacheReplicator.java:314) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.replicationThreadMain(RMIAsynchronousCacheReplicator.java:127) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator.access$000(RMIAsynchronousCacheReplicator.java:58) 
     at net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator$ReplicationThread.run(RMIAsynchronousCacheReplicator.java:389) 
Caused by: java.net.ConnectException: Connection refused 
     at java.net.PlainSocketImpl.socketConnect(Native Method) 
     at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
     at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
     at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
     at java.net.Socket.connect(Socket.java:589) 
     at java.net.Socket.connect(Socket.java:538) 
     at java.net.Socket.<init>(Socket.java:434) 
     at java.net.Socket.<init>(Socket.java:211) 
     at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 
     at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) 
     at net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory.createSocket(ConfigurableRMIClientSocketFactory.java:70) 
     at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 
     ... 8 more 

UPDATE

我已经改变了错误,我得到我的节点

节点1

我的配置现在使用自动发现而不是手动。 我有四台服务器,2在站点A和2在站点B 复制的现在工作作为两个节点,但是没有复制是发生在站点B或站点A和站点B.

之间预期站点A我在每个节点和其他节点之间使用了netcat和telnet,并且接受了所有连接。

这里是我的Ehcache配置为自动发现的有关章节

<cacheManagerPeerProviderFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory" 
           properties="peerDiscovery=automatic, 
              multicastGroupAddress=230.3.0.0, 
              multicastGroupPort=4700, 
              timeToLive=255"/> 

<cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="port=43000, 
       socketTimeoutMillis=20000"/> 

谁能提供任何深入了解如何复制不工作在站点B或我可以尝试任何想法?

感谢

+0

你使用IPV4吗?如果您使用IPV6,那么在ehcache复制中可能会出现一些问题 –

+0

我们正在使用IPV4 – Damien

回答

2

请检查下面的步骤来解决此问题

  1. 中添加监听的主机名,如下。

    <cacheManagerPeerListenerFactory 
    class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" 
    properties="hostName=localhost,port=40001"/> 
    
  2. 检查端口40002是否可以访问,以便它可以从node1访问。应该可以从节点1访问手段node2.mydomain.com:40002。从控制台,你可以使用telnet程序来检查它。同样,检查node1是否可以从node2访问。 (我相信这是造成问题的原因)

可选:您不需要在两台服务器中有不同的端口。它可以有相同的端口号40001

+0

我之前尝试过hostname = localhost,但它在日志中发出警告 - 该部分究竟做了什么? – Damien

+1

如果端口40001在同一台主机上打开(我的答案中的第2点),它不应该发出警告。这个警告必须是冰山一角。如果你解决它,你的问题必须解决 – Thanga

+0

我已经更新我的代码(和问题)以使用自动发现,但不幸的是仍然有问题。我在所有节点之间尝试过telent和netcat,并且连接已打开。任何想法,为什么,y复制目前只有一半的工作? – Damien

1

当我们收到一位网络专家的建议时,我回到了手动发现的方法,即使用跨数据中心的多播技术打开了整个世界的痛苦。

对Thanga的建议使用手动方法已经工作