blob: 1b5c3b1314f57e48f74dc58036e4417505f5a62f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package javax.websocket;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* This method level annotation can be used to make a Java method receive incoming web socket messages. Each websocket
* endpoint may only have one message handling method for each of the native websocket message formats: text, binary and
* pong. Methods using this annotation are allowed to have parameters of types described below, otherwise the container
* will generate an error at deployment time.
* <p/>
* The allowed parameters are:
* <ol>
* <li>Exactly one of any of the following choices
* <ul>
* <li>if the method is handling text messages:
* <ul>
* <li>String to receive the whole message</li>
* <li>Java primitive or class equivalent to receive the whole message converted to that type</li>
* <li>String and boolean pair to receive the message in parts</li>
* <li>Reader to receive the whole message as a blocking stream</li>
* <li>any object parameter for which the endpoint has a text decoder (Decoder.Text or Decoder.TextStream).</li>
* </ul>
* </li>
* <li>if the method is handling binary messages:
* <ul>
* <li>byte[] or ByteBuffer to receive the whole message</li>
* <li>byte[] and boolean pair, or ByteBuffer and boolean pair to receive the message in parts</li>
* <li>InputStream to receive the whole message as a blocking stream</li>
* <li>any object parameter for which the endpoint has a binary decoder (Decoder.Binary or Decoder.BinaryStream).</li>
* </ul>
* </li>
* <li>if the method is handling pong messages:
* <ul>
* <li>PongMessage for handling pong messages</li>
* </ul>
* </li>
* </ul>
* </li>
* <li>and Zero to n String or Java primitive parameters annotated with the PathParam annotation for server endpoints.</li>
* <li>and an optional Session parameter</li>
* </ol>
* <p/>
* The parameters may be listed in any order.
* <p/>
* The method may have a non-void return type, in which case the web socket runtime must interpret this as a web socket
* message to return to the peer. The allowed data types for this return type, other than void, are String, ByteBuffer,
* byte[], any Java primitive or class equivalent, and anything for which there is an encoder. If the method uses a Java
* primitive as a return value, the implementation must construct the text message to send using the standard Java
* string representation of the Java primitive unless there developer provided encoder for the type configured for this
* endpoint, in which case that encoder must be used. If the method uses a class equivalent of a Java primitive as a
* return value, the implementation must construct the text message from the Java primitive equivalent as described
* above.
* <p/>
* Developers should note that if developer closes the session during the invocation of a method with a return type, the
* method will complete but the return value will not be delivered to the remote endpoint. The send failure will be
* passed back into the endpoint's error handling method.
* <p/>
* For example:
* <p/>
* <code>
*
* @OnMessage public void processGreeting(String message, Session session) { System.out.println("Greeting received:" +
* message); } </code>
* <p/>
* For example:
* <p/>
* <code>
* @OnMessage public void processUpload(byte[] b, boolean last, Session session) {
* // process partial data here, which check on last to see if these is more on the way } </code>
* <p/>
* Developers should not continue to reference message objects of type Reader, ByteBuffer or InputStream
* after the annotated method has completed, since they may be recycled by the implementation.
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface OnMessage {
long maxMessageSize() default -1L;
}