2011-05-15 98 views
3

我正在嘗試gwt-comet擴展here。我無法從服務器獲得任何消息到客戶端。gwt-comet GWT的基本使用

我有一個RPC服務實現的基本GWT應用程序。

客戶: MockGui.java

public class MockGui implements EntryPoint { 
    @SerialTypes({ 
     Message.class 
    }) 

    public static abstract class MyMessageSerializer extends CometSerializer { 
    } 

    public void onModuleLoad() { 
    ... 

     goServer(); 
    } 

    public void goServer() { 
     GreetingServiceAsync service = GWT.create(GreetingService.class); 
     service.greetServer(new Message(), new AsyncCallback<Void>() { 

      @Override 
      public void onSuccess(Void result) { 
       // TODO Auto-generated method stub 

      } 

      @Override 
      public void onFailure(Throwable caught) { 
       // TODO Auto-generated method stub 

      } 
     }); 

     CometListener listener = new CometListener() { 
      public void onConnected(int heartbeat) { 
      } 

      public void onDisconnected() { 
      } 

      public void onHeartbeat() { 
      } 

      public void onRefresh() { 
      } 

      public void onError(Throwable exception, boolean connected) { 
       // warn the user of the connection error 
      } 

      public void onMessage(List<? extends Serializable> messages) { 
       for (Serializable message : messages) { 
        if (message.getClass().equals(Message.class)) { 
         Message myMessage = (Message) message; 
         Window.alert(myMessage .getMessage()); 

         Log.info("This is a 'INFO' test message"); 
         Log.warn("This is a 'WARN' test message"); 
        } 
       } 
      } 
     }; 

     String serverUrl = GWT.getModuleBaseURL() + "greet"; 

     CometSerializer serializer = GWT.create(MyMessageSerializer.class); 

     CometClient client = new CometClient(serverUrl, serializer, listener); 

     client.start(); 
} 

服務器: GreetingServiceImpl.java

public class GreetingServiceImpl extends RemoteServiceServlet implements 
     GreetingService { 
    List<Message> messages = new ArrayList<Message>(); 

    public void greetServer(Message message) throws IllegalArgumentException { 
     HttpSession httpSession = getThreadLocalRequest().getSession(); 

     CometSession cometSession = CometServlet.getCometSession(httpSession); 

     Message m = new Message(); 
     m.setMessage("test from server"); 

     cometSession.enqueue(m); 
    } 
} 

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE web-app 
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
    "http://java.sun.com/dtd/web-app_2_3.dtd"> 

<web-app> 

    <!-- Servlets --> 
    <servlet> 
     <servlet-name>greetServlet</servlet-name> 
     <servlet-class>test.mock.gui.server.GreetingServiceImpl</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>greetServlet</servlet-name> 
     <url-pattern>/mockgui/greet</url-pattern> 
    </servlet-mapping> 

    <!-- the comet servlet for streaming messages to the client --> 
    <servlet> 
     <servlet-name>myComet</servlet-name> 
     <servlet-class>net.zschech.gwt.comet.server.CometServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>myComet</servlet-name> 
     <url-pattern>/mockgui/comet</url-pattern> 
    </servlet-mapping> 

    <!-- Default page to serve --> 
    <welcome-file-list> 
     <welcome-file>MockGui.html</welcome-file> 
    </welcome-file-list> 

</web-app> 

我希望觸發客戶端(偵聽器)的彗星偵聽器 - 但似乎沒有任何事情發生。我不知道如何進一步調試問題 - 沒有任何執行失敗。

有什麼辦法可以看到彗星servlet(myComet)何時被觸發以及它在做什麼?

回答

4

看來這是您使用的彗星請求的網址:

String serverUrl = GWT.getModuleBaseURL() + "greet"; 

但是你在web.xml彗星網址是/ mockgui /彗星。你至少可以嘗試更換以上符合這一?:

String serverUrl = GWT.getModuleBaseURL() + "comet"; 

,如果仍然不工作,做一個

Window.alert(serverUrl); 

,看看URL實際上指向彗星的servlet 。

祝你好運!