如何在两个JVM进程之间共享对象

时间:2016-09-13 11:22:34

标签: java concurrency synchronization

我正在使用给定的client.jar编写聊天室应用程序。我的主要工作是编写服务器。然后我可以在命令窗口中运行server.jar,如果我想设置第二个服务器,我将打开另一个命令窗口并再次运行server.jar。这是我的简要代码:

public class Server {
    public static void main(String args[]) {
        /*Read the parameter,such as IP address and port from config file
         Each line in the file represents a server*/

        // Code: Get the parameter for setting serverSocket...

        /*Here I want to use a ServerInfo class to store 
         name of all the activated server, it has an attribute 
         'ArrayList<String> list', every time before set
         up the server, firstly add server name to the list*/

        ServerInfo.getInstance().list.add(server name);

        try {
            // set up the serversocket
            while(true) {
                // listening to the client
            }
        } catch {
            // other codes
        }
    }
}

对于ServerInfo类,我使用单例来获取其实例,这样每次我都可以将服务器名称添加到同一个ArrayList

问题就出现了。在我第一次运行server.jar之后,我可以成功地为列表添加一个名称,但是,当我再次运行server.jar来设置另一个服务器时,方法getInstance()不起作用,看起来像创建ServerInfo类的新实例,并将第二个服务器名称添加到此新实例的Arraylist。所以我无法将所有名称添加到同一实例的ArrayList中。

无论如何要处理这个问题?

1 个答案:

答案 0 :(得分:0)

首先,您运行server.jar两次。这会创建两个不同的java进程和而不是线程。这里,由于两个进程(2 server.jar进程)之间没有进程间通信,因此无法共享对象。它们被视为一个独立的。

需要非常仔细地考虑在两个不同的服务器实例之间共享对象。

例如:假设您有2个不同的服务器来处理您网站的请求,当用户登录您的网站时,您希望共享会话对象在两台服务器之间,如果一台服务器发生故障,另一台服务器可以处理正在进行的请求。因此,用户不会获得任何内部服务器异常。

可以通过在托管域模式下使用某些应用服务器(如 JBoss AS)来实现此方案。

有关Jboss AS托管域模式的更多详细信息,请检查此项 https://docs.jboss.org/author/display/AS7/Operating+modes