2013-07-05 29 views
5

Wpadłem na ten problem i miałem trudności ze znalezieniem odpowiedzi na to gdziekolwiek, więc pomyślałem, że wprowadzę to tutaj dla przyszłych programistów.Serwer Jetty 9 Serwer sieci Web Maksymalna wielkość wiadomości w sesji

Jeśli na moście 9 zostanie podjęta próba ustawienia maksymalnej wielkości komunikatu dla obiektu sesji w celu obsługi dużych pakietów danych, nie będzie działać. Wciąż będziesz się rozłączał, jeśli twój klient będzie próbował wysłać duże dane. Mówię o setMaximimumMessageSize na tym obiekcie: http://download.eclipse.org/jetty/stable-9/apidocs/org/eclipse/jetty/websocket/api/Session.html

Zamiast tego, musisz ustawić maksymalny rozmiar wiadomości na obiekcie polityki uzyskanym z WebSocketServletFactory.

public final class MyWebSocketServlet extends WebSocketServlet 
{ 
    private static final long MAX_MESSAGE_SIZE = 1000000; 

    @Override 
    public void configure(WebSocketServletFactory factory) 
    { 
     factory.getPolicy().setMaxMessageSize(MAX_MESSAGE_SIZE); 
     factory.setCreator(new MyWebSocketCreator()); 
    } 
} 

To będzie działać zgodnie z przeznaczeniem, a twój serwer będzie w stanie obsłużyć duże wiadomości do maksymalnego ustawionego rozmiaru.

Odpowiedz

6

Sposób ustawiania maksymalnej wiadomości w WebSocketServlet jest poprawny.

Session.setMaximumMessageSize (long), jak wskazano w javadoc, jest niestety nieszczelnym wczesnym projektem JSR-356 (javax.websocket API).

To metoda na molo bocznej API nie powinien być tam, i został usunięty w Jetty 9.1

Bug został złożony: https://bugs.eclipse.org/bugs/show_bug.cgi?id=412439

Uwaga: Jetty 9.1 będzie miał JSR-356 (javax. websocket API) w nim wsparcie. Gdzie javax.websocket.Session ma 2 metody podobnego zachowania.

  • javax.websocket.Session.setMaxBinaryMessageBufferSize(int)
  • javax.websocket.Session.setMaxTextMessageBufferSize(int)
0

miałem ten problem przy wysyłaniu plików (dane binarne) z ponad 64KB. Używałem javax.websocket-example from the Embedded Jetty WebSocket Examples. Ostatecznie jedyną rzeczą, którą muszę zrobić, to setMaxBinaryMessageBufferSize w argumencie Session z metody opatrzonej komentarzem @OnOpen.

@ClientEndpoint 
@ServerEndpoint(value = "/ws") 
public class EventSocket { 

    @OnOpen 
    public void onWebSocketConnect(Session sess) { 
     sess.setMaxBinaryMessageBufferSize(1 * 1024 * 1024); // 1MB 
    } 

    @OnMessage 
    public void processUpload(byte[] b, boolean last, Session session) { 
      ... 
    } 

} 
0

Jeśli ktoś chce konfigurowalną alternatywę, ustawienie parametru servlet w web.xml również działa -

<servlet> 
    <servlet-name>MyWebSocketServlet</servlet-name> 
    <servlet-class>test.MyWebSocketServlet</servlet-class> 
    <init-param> 
     <param-name>maxTextMessageSize</param-name> 
     <param-value>1048576</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>MyWebSocketServlet</servlet-name> 
    <url-pattern>/MyWebSocket/*</url-pattern> 
</servlet-mapping>