Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 其中一个ehcache节点错误地尝试连接到127.0.0.1_Java_Rmi_Ehcache - Fatal编程技术网

Java 其中一个ehcache节点错误地尝试连接到127.0.0.1

Java 其中一个ehcache节点错误地尝试连接到127.0.0.1,java,rmi,ehcache,Java,Rmi,Ehcache,你们能帮我理解为什么一个ehcache节点错误地尝试连接到127.0.0.1吗 我正在使用ehcache 2.8.3。我的一个节点正在VMWare下以NAT模式运行。因此,主机具有ip192.168.10.1(Windows 7),而VMWare中的主机具有ip192.168.10.128(CentOS 6) 我有以下ehcache配置 如果我在配置文件中的任何地方都没有连接到127.0.0.1,为什么它要尝试连接到127.0.0.1 我可以从192.168.10.1远程登录到192.168

你们能帮我理解为什么一个ehcache节点错误地尝试连接到127.0.0.1吗

我正在使用ehcache 2.8.3。我的一个节点正在VMWare下以NAT模式运行。因此,主机具有ip
192.168.10.1
(Windows 7),而VMWare中的主机具有ip
192.168.10.128
(CentOS 6)

我有以下ehcache配置

如果我在配置文件中的任何地方都没有连接到127.0.0.1,为什么它要尝试连接到127.0.0.1

我可以从192.168.10.1远程登录到192.168.10.128:51000

我还尝试启用引导,并开始看到以下日志消息

2014-07-11 02:35:30.515 +0400 DEBUG cache peers: [RMICachePeer_Stub[UnicastRef2 [liveRef: [endpoint:[127.0.0.1:18405,net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory@7d0](remote),objID:[-43892557:1472247d06b:-7fff, -5287536613776006259]]]]]
2014-07-11 02:35:30.516 +0400 DEBUG Bootstrapping myCache1 from RMICachePeer_Stub[UnicastRef2 [liveRef: [endpoint:[127.0.0.1:18405,net.sf.ehcache.distribution.ConfigurableRMIClientSocketFactory@7d0](remote),objID:[-43892557:1472247d06b:-7fff, -5287536613776006259]]]]

为什么它认为我有同侪在
127.0.0.1:18405

在JDK和ehcache源代码中调试了好几个小时后,我发现了这一点

我的核心错误假设是,我看到错误的Windows节点出现了问题。原来是linux节点提供了不正确的地址

官方Ehcache常见问题解答:

这是由2008年对Ubuntu/DebianLinux默认设置的更改引起的 网络配置。本质上,Java调用 InetAddress.getLocalHost();始终返回环回地址,该地址 是127.0.0.1。为什么?因为在最近的发行版中,一个$ 主机名始终返回映射到环回设备的地址, 这使得Ehcache的RMI对等创建逻辑始终分配 环回地址,它会导致您看到的错误。你需要的一切 要做的是打开网络配置并确保主机名 返回其他计算机可访问的有效网络地址 网络上的对等点

Linux节点在下面的类
java.rmi.registry.LocateRegistry

public static Registry getRegistry(String host, int port, RMIClientSocketFactory csf) throws RemoteException
{
    Registry registry = null;

    if (port <= 0)
        port = Registry.REGISTRY_PORT;

    if (host == null || host.length() == 0) {
        // If host is blank (as returned by "file:" URL in 1.0.2 used in
        // java.rmi.Naming), try to convert to real local host name so
        // that the RegistryImpl's checkAccess will not fail.
        try {
            host = java.net.InetAddress.getLocalHost().getHostAddress();
        } catch (Exception e) {
            // If that failed, at least try "" (localhost) anyway...
            host = "";
        }
    }

    LiveRef liveRef = new LiveRef(new ObjID(ObjID.REGISTRY_ID), new TCPEndpoint(host, port, csf, null), false);
    RemoteRef ref = (csf == null) ? new UnicastRef(liveRef) : new UnicastRef2(liveRef);

    return (Registry) Util.createProxy(RegistryImpl.class, ref, false);
}
Terracotta的官方建议是修改
hosts
文件,这对我来说太残酷了。我的结论是,Ops团队只需在我的服务器的命令行中提供正确的绑定地址就更容易了,如下所示

java -Djava.rmi.server.hostname=192.168.10.128 -jar services.jar

在JDK和ehcache源代码中调试了好几个小时后,我终于明白了这一点

我的核心错误假设是,我看到错误的Windows节点出现了问题。原来是linux节点提供了不正确的地址

官方Ehcache常见问题解答:

这是由2008年对Ubuntu/DebianLinux默认设置的更改引起的 网络配置。本质上,Java调用 InetAddress.getLocalHost();始终返回环回地址,该地址 是127.0.0.1。为什么?因为在最近的发行版中,一个$ 主机名始终返回映射到环回设备的地址, 这使得Ehcache的RMI对等创建逻辑始终分配 环回地址,它会导致您看到的错误。你需要的一切 要做的是打开网络配置并确保主机名 返回其他计算机可访问的有效网络地址 网络上的对等点

Linux节点在下面的类
java.rmi.registry.LocateRegistry

public static Registry getRegistry(String host, int port, RMIClientSocketFactory csf) throws RemoteException
{
    Registry registry = null;

    if (port <= 0)
        port = Registry.REGISTRY_PORT;

    if (host == null || host.length() == 0) {
        // If host is blank (as returned by "file:" URL in 1.0.2 used in
        // java.rmi.Naming), try to convert to real local host name so
        // that the RegistryImpl's checkAccess will not fail.
        try {
            host = java.net.InetAddress.getLocalHost().getHostAddress();
        } catch (Exception e) {
            // If that failed, at least try "" (localhost) anyway...
            host = "";
        }
    }

    LiveRef liveRef = new LiveRef(new ObjID(ObjID.REGISTRY_ID), new TCPEndpoint(host, port, csf, null), false);
    RemoteRef ref = (csf == null) ? new UnicastRef(liveRef) : new UnicastRef2(liveRef);

    return (Registry) Util.createProxy(RegistryImpl.class, ref, false);
}
Terracotta的官方建议是修改
hosts
文件,这对我来说太残酷了。我的结论是,Ops团队只需在我的服务器的命令行中提供正确的绑定地址就更容易了,如下所示

java -Djava.rmi.server.hostname=192.168.10.128 -jar services.jar

我会修复主机文件。将真实主机名映射到127.0.0.1完全是错误的。我认为这是暂时的异常。我的hosts文件如下所示-127.0.0.1 localhost.localdomain localhost 10.135.14.34 myhost.mydomain.com myhost。10.135.14.34的ip地址是有效的,但我仍然得到了错误-有什么想法吗?我得到了这个行为,它试图连接的地址是一个公共地址!修改hosts文件似乎是正确的,但您不可能知道服务器解析主机名的内容和方式。我只是猜测我的域名在路上的某个地方,它解析为该域名(我们的网站)的公共IP地址,甚至不是广域网连接的公共IP。我会修复主机文件。将真实主机名映射到127.0.0.1完全是错误的。我认为这是暂时的异常。我的hosts文件如下所示-127.0.0.1 localhost.localdomain localhost 10.135.14.34 myhost.mydomain.com myhost。10.135.14.34的ip地址是有效的,但我仍然得到了错误-有什么想法吗?我得到了这个行为,它试图连接的地址是一个公共地址!修改hosts文件似乎是正确的,但您不可能知道服务器解析主机名的内容和方式。我只是猜测我的域名在路上的某个地方,它解析为该域名(我们的网站)的公共IP地址,而不是广域网连接的公共IP。
java -Djava.rmi.server.hostname=192.168.10.128 -jar services.jar