diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java index c2a81bd27d9..bbf96557088 100644 --- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java +++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/RemoteEndpoint.java @@ -128,6 +128,15 @@ public interface RemoteEndpoint */ BatchMode getBatchMode(); + /** + * Set the batch mode with which messages are sent. + * + * @param mode + * the batch mode to use + * @see #flush() + */ + void setBatchMode(BatchMode mode); + /** * Flushes messages that may have been batched by the implementation. * @throws IOException if the flush fails diff --git a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java index 25d1001e7b1..111e3a9fa29 100644 --- a/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java +++ b/jetty-websocket/websocket-api/src/main/java/org/eclipse/jetty/websocket/api/annotations/WebSocket.java @@ -24,6 +24,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.eclipse.jetty.websocket.api.BatchMode; + /** * Tags a POJO as being a WebSocket class. */ @@ -40,4 +42,6 @@ public @interface WebSocket int maxIdleTime() default -2; int maxTextMessageSize() default -2; + + BatchMode batchMode() default BatchMode.AUTO; } diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpoint.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpoint.java index 6d9b93dc82a..9468ee6c57f 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpoint.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketRemoteEndpoint.java @@ -436,9 +436,7 @@ public class WebSocketRemoteEndpoint implements RemoteEndpoint return batchMode; } - // Only the JSR needs to have this method exposed. - // In the Jetty implementation the batching is set - // at the moment of opening the session. + @Override public void setBatchMode(BatchMode batchMode) { this.batchMode = batchMode; diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java index 3654c59c757..e0e2c91d08b 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/WebSocketSession.java @@ -71,6 +71,7 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc private WebSocketPolicy policy; private UpgradeRequest upgradeRequest; private UpgradeResponse upgradeResponse; + private BatchMode batchMode = BatchMode.AUTO; public WebSocketSession(URI requestURI, EventDriver websocket, LogicalConnection connection, SessionListener... sessionListeners) { @@ -400,14 +401,20 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc } ClassLoader old = Thread.currentThread().getContextClassLoader(); - try { + try + { Thread.currentThread().setContextClassLoader(classLoader); // Upgrade success connection.getIOState().onConnected(); - + // Connect remote - remote = new WebSocketRemoteEndpoint(connection,outgoingHandler,getBatchMode()); + BatchMode endpointBatchMode = websocket.getBatchMode(); + if (endpointBatchMode == null) + { + endpointBatchMode = this.getBatchMode(); + } + remote = new WebSocketRemoteEndpoint(connection,outgoingHandler,endpointBatchMode); // Open WebSocket websocket.openSession(this); @@ -496,11 +503,20 @@ public class WebSocketSession extends ContainerLifeCycle implements Session, Inc } /** - * @return the default (initial) value for the batching mode. + * @return the batching mode default for RemoteEndpoint behavior */ public BatchMode getBatchMode() { - return BatchMode.AUTO; + return batchMode; + } + + /** + * Set the batch mode default for the RemoteEndpoint behavior. + * @param mode the batching mode. + */ + public void setBatchMode(BatchMode mode) + { + this.batchMode = mode; } @Override diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java index d4462647433..df26e7e8f42 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/AbstractEventDriver.java @@ -25,6 +25,7 @@ import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.Utf8Appendable.NotUtf8Exception; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; +import org.eclipse.jetty.websocket.api.BatchMode; import org.eclipse.jetty.websocket.api.CloseException; import org.eclipse.jetty.websocket.api.StatusCode; import org.eclipse.jetty.websocket.api.WebSocketPolicy; @@ -208,6 +209,12 @@ public abstract class AbstractEventDriver implements IncomingFrames, EventDriver { /* TODO: provide annotation in future */ } + + @Override + public BatchMode getBatchMode() + { + return null; + } @Override public void openSession(WebSocketSession session) diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriver.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriver.java index e4d4d836bf1..3c3f28c5f1c 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriver.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/EventDriver.java @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.Reader; import java.nio.ByteBuffer; +import org.eclipse.jetty.websocket.api.BatchMode; import org.eclipse.jetty.websocket.api.WebSocketPolicy; import org.eclipse.jetty.websocket.api.extensions.Frame; import org.eclipse.jetty.websocket.api.extensions.IncomingFrames; @@ -34,6 +35,8 @@ public interface EventDriver extends IncomingFrames public WebSocketPolicy getPolicy(); public WebSocketSession getSession(); + + public BatchMode getBatchMode(); public void onBinaryFrame(ByteBuffer buffer, boolean fin) throws IOException; diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyAnnotatedEventDriver.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyAnnotatedEventDriver.java index 45dcaf2b70e..4d17bd0321d 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyAnnotatedEventDriver.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/events/JettyAnnotatedEventDriver.java @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.Reader; import java.nio.ByteBuffer; +import org.eclipse.jetty.websocket.api.BatchMode; import org.eclipse.jetty.websocket.api.WebSocketPolicy; import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.eclipse.jetty.websocket.api.extensions.Frame; @@ -40,6 +41,7 @@ public class JettyAnnotatedEventDriver extends AbstractEventDriver { private final JettyAnnotatedMetadata events; private boolean hasCloseBeenCalled = false; + private BatchMode batchMode; public JettyAnnotatedEventDriver(WebSocketPolicy policy, Object websocket, JettyAnnotatedMetadata events) { @@ -64,6 +66,13 @@ public class JettyAnnotatedEventDriver extends AbstractEventDriver { this.policy.setIdleTimeout(anno.maxIdleTime()); } + this.batchMode = anno.batchMode(); + } + + @Override + public BatchMode getBatchMode() + { + return this.batchMode; } @Override