0

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

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

目前我正在研究 RMI 和 Axis2。

我无法让 RMI 成功工作。我正在关注官方教程并在本地不断收到安全异常,并想象当涉及 Tomcat 时情况会变得更糟。

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

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

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

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

4

3 回答 3

2

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

于 2011-11-15T20:41:19.483 回答
1

有很多选择:

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

如果你在 Linux 上:

鉴于您的环境,我会选择 REST。

于 2011-11-15T20:42:37.463 回答
0

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

这是我正在使用的 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 在以后工作。

于 2011-11-16T02:36:25.883 回答