Web服务器RMI之间的互操作性

时间:2011-12-10 18:25:50

标签: java servlets rmi

我有一个TCP / RMI服务器与运行Apache tomcat的Web服务器通信,所有信息,例如客户都存储在TCP / RMI服务器上。这些都是在java(tcp套接字,Java RMI,servlet,JavaBeans,JSP,comet)中完成的。

两台服务器之间的通信由RMI完成。

Web客户端向http Web服务器发出请求,http服务器将它们转发到服务器TCP / RMI。到目前为止一切都很好。

问题是反向通信,服务器TCP / RMI到Web服务器。由于服务器之间的连接是由RMI执行的,您可以通过Web服务器发送回调,就像客户端和服务器rmi之间的异步通信一样?

此致 安德烈

1 个答案:

答案 0 :(得分:-1)

通过提供服务器可以调用的回调对象,可以进行双向通信。您也可以只运行2个RMI服务器。 TCP服务器上有1个,Tomcat上有另外1个。因此也创建了双向通信链路。您可以使用静态方法和contextlistener在TomCat上启动RMI服务器。

我目前正在开展一个类似的项目,包括Glassfish,RMI双向通信,Comet等。这是我在Web应用程序中的RMI服务器类。可能会给你一些灵感。

package RMI.WS;

import ILWS.Controller.Comet.CometServlet;
import Logging.DSLogger;
import RMI.DSRMI;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

/**
 *
 * @author roy
 */
public class RMIServer implements Runnable {

    private static final String rmiPath = "ILWServlet";
    private static final String ClientrmiPath = "ILDS";
    private static RemoteInteractor interactor;
    private static DSRMI rmiClient;
    private static RMIServer rmi;
    private static int rmiPort;

    public static void startRMI() {
        rmiPort = 6666;
        try {
            interactor = new RemoteInteractor();
            LocateRegistry.createRegistry(rmiPort).rebind(rmiPath, interactor);
            DSLogger.Debug(RMIServer.class, "creating new RMI Registry");
        } catch (Exception ex) {
            DSLogger.Log(RMIServer.class, ex.getMessage());
        }
    }

    public static void stopRMI() {
        try {
            LocateRegistry.getRegistry("127.0.0.1", rmiPort).unbind("ILWServlet");
            DSLogger.Debug(RMIServer.class, "removing RMI Registry");
        } catch (Exception ex) {
            DSLogger.throwableLog(RMIServer.class, ex);
        }
    }

    public static DSRMI getClientRMI() {
        if (rmiClient == null) {
            try {
                rmiClient = (DSRMI) LocateRegistry.getRegistry("127.0.0.1", 6665).lookup(ClientrmiPath);
            } catch (NotBoundException ex) {
                DSLogger.throwableLog(RMIServer.class, ex);
            } catch (Exception ex) {
                DSLogger.throwableLog(RMIServer.class, ex);
            }
        }
        return rmiClient;
    }  
}