2011-11-15 64 views
0

我有一個Java Web應用程序,我正在爲一個學校項目開發。需要將表示層(servlets/jsp)部署到一臺服務器,並將業務邏輯部署到另一臺服務器。獲取2臺Tomcat服務器相互之間的通信

我需要一個連接2臺服務器的解決方案。

目前我已經在研究RMI和Axis2。

我無法讓RMI成功工作。我正在關注official tutorial,並在本地繼續獲取安全性異常,並且想象當涉及Tomcat時它會變得更糟。

Axis2似乎是一個很好的解決方案,但我需要時間加以解決。

我的問題是:有一個簡單的方法連接2個服務器,以便我可以打電話給我的業務層?也許Tomcat有內置的東西。

如果RMI是我應該使用的事實上的協議和API,那麼在Tomcat中使用RMI還有什麼好的教程。

我正在使用的服務器都運行Tomcat。

回答

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個工作。

2

我不確定您的數據層有多複雜,但您可以使用Apache CXF在業務邏輯服務器上實現REST接口。這應該比使用Axis2更容易。

+0

他也可以使用spring mvc,只需要業務層返回json或xml。 – Kevin

1

有很多很多的選擇:

  • 從一個側面寫文件,從另一個讀取它。 「另一方」必須有一個無限循環來監視「一方」寫請求文件的文件夾。
  • 使用sockets
  • 使用REST
  • RMI

如果你是在Linux上:

鑑於你的環境,我會去與REST。