让2台Tomcat服务器相互通信

时间:2011-11-15 20:29:56

标签: java tomcat servlets rmi business-logic-layer

我正在为一个学校项目开发一个Java Web应用程序。需要将表示层(servlets / jsp)部署到一个服务器,并将业务逻辑部署到另一个服务器。

我需要一个连接两台服务器的解决方案。

目前我正在研究RMI和Axis2。

我无法让RMI成功运作。我正在关注official tutorial并继续在本地获取安全异常,并想象当涉及Tomcat时它会变得更糟。

Axis2似乎是一个很好的解决方案,但我需要时间来加强它。

我的问题是:有一种连接2服务器的简单方法,以便我可以调用我的业务层吗?也许Tomcat内置了一些东西。

如果RMI是我应该使用的事实上的协议和API,那么有没有关于在Tomcat中使用RMI的好教程。

我正在使用的服务器都在运行Tomcat。

3 个答案:

答案 0 :(得分:2)

我不确定您的数据层有多复杂,但您可以使用Apache CXF在业务逻辑服务器上实现REST接口。这应该比使用Axis2更容易。

答案 1 :(得分:1)

有很多选择:

  • 从一侧写一个文件,从另一侧读取。 “另一个”必须有一个无限循环来监视“一方”写入请求文件的文件夹。
  • 使用sockets
  • 使用REST
  • RMI

如果您使用的是Linux:

考虑到你的环境,我会选择REST。

答案 2 :(得分:0)

我最终使用了RMI。使用本教程,我得到了它的工作:http://sacrosanctblood.blogspot.com/2008/11/rmi-tutorial-rmi-and-tomcat.html。关键是:在启动servlet中,你必须确保你要删除的对象是类作用域而不是方法作用域。此外,不需要安全管理器代码。

这是我正在使用的startServer servlet的代码:

public class startServer extends HttpServlet
{
    public static boolean isRegistered = false;    
    public IRemote service = new RemoteImpl();

    @Override
    public void init(ServletConfig config) throws ServletException
    {
        super.init(config);        
        if (!isRegistered)
        {
            try
            {                
                IRemote stub = (IRemote) UnicastRemoteObject.exportObject(service, 0);
                Registry registry = LocateRegistry.createRegistry(9345);
                registry.rebind(IRemote.serviceName, stub);
                System.out.println("Remote service bound");
                isRegistered = true;
            }
            catch (Exception e)
            {
                System.err.println("Remote service exception:");
                e.printStackTrace();
            }
        }
    }
}

这是客户端代码:

public String getRemoteString()
{
    String result = "";
    try
    {
        Registry registry = LocateRegistry.getRegistry(9345);            
        IRemote serv = (IRemote) registry.lookup(IRemote.serviceName);

        result = serv.executeRemote("Test");
    }
    catch (Exception e)
    {
        System.err.println("Remoteservice exception:");
        e.printStackTrace();
    }

    return result;
}

目前它在同一台服务器上运行,但我确信我可以在以后使用2。