[[websocket-component]]
= Jetty Websocket Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-websocket/src/main/docs/websocket-component.adoc
:docTitle: Jetty Websocket
:artifactId: camel-websocket
:description: Expose websocket endpoints using Jetty.
:since: 2.10
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*

The WebSocket component provides websocket
endpoints for communicating with clients using
websocket. The component uses Eclipse Jetty Server which implements the
http://tools.ietf.org/html/rfc6455[IETF] specification (drafts and RFC
6455). It supports the protocols ws:// and wss://. To use wss://
protocol, the SSLContextParameters must be defined.

== URI format

[source,java]
---------------------------------------------------
websocket://hostname[:port][/resourceUri][?options]
---------------------------------------------------

You can append query options to the URI in the following format,
`?option=value&option=value&...`

== Websocket Options






// component options: START
The Jetty Websocket component supports 15 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *host* (common) | The hostname. The default value is 0.0.0.0 | 0.0.0.0 | String
| *port* (common) | The port number. The default value is 9292 | 9292 | Integer
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *staticResources* (consumer) | Set a resource path for static resources (such as .html files etc). The resources can be loaded from classpath, if you prefix with classpath:, otherwise the resources is loaded from file system or from JAR files. For example to load from root classpath use classpath:., or classpath:WEB-INF/static If not configured (eg null) then no static resource is in use. |  | String
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *enableJmx* (advanced) | If this option is true, Jetty JMX support will be enabled for this endpoint. See Jetty JMX support for more details. | false | boolean
| *maxThreads* (advanced) | To set a value for maximum number of threads in server thread pool. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. The default values for maxThreads is 1 2 noCores. |  | Integer
| *minThreads* (advanced) | To set a value for minimum number of threads in server thread pool. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. The default values for minThreads is 1. |  | Integer
| *threadPool* (advanced) | To use a custom thread pool for the server. MaxThreads/minThreads or threadPool fields are required due to switch to Jetty9. |  | ThreadPool
| *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
| *sslKeyPassword* (security) | The password for the keystore when using SSL. |  | String
| *sslKeystore* (security) | The path to the keystore. |  | String
| *sslPassword* (security) | The password when using SSL. |  | String
| *useGlobalSslContextParameters* (security) | Enable usage of global SSL context parameters. | false | boolean
|===
// component options: END










// endpoint options: START
The Jetty Websocket endpoint is configured using URI syntax:

----
websocket:host:port/resourceUri
----

with the following path and query parameters:

=== Path Parameters (3 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *host* | The hostname. The default value is 0.0.0.0. Setting this option on the component will use the component configured value as default. | 0.0.0.0 | String
| *port* | The port number. The default value is 9292. Setting this option on the component will use the component configured value as default. | 9292 | Integer
| *resourceUri* | *Required* Name of the websocket channel to use |  | String
|===


=== Query Parameters (20 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *maxBinaryMessageSize* (common) | Can be used to set the size in bytes that the websocket created by the websocketServlet may be accept before closing. (Default is -1 - or unlimited) | -1 | Integer
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
| *sessionSupport* (consumer) | Whether to enable session support which enables HttpSession for each http request. | false | boolean
| *staticResources* (consumer) | Set a resource path for static resources (such as .html files etc). The resources can be loaded from classpath, if you prefix with classpath:, otherwise the resources is loaded from file system or from JAR files. For example to load from root classpath use classpath:., or classpath:WEB-INF/static If not configured (eg null) then no static resource is in use. |  | String
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *sendTimeout* (producer) | Timeout in millis when sending to a websocket channel. The default timeout is 30000 (30 seconds). | 30000 | Integer
| *sendToAll* (producer) | To send to all websocket subscribers. Can be used to configure on endpoint level, instead of having to use the WebsocketConstants.SEND_TO_ALL header on the message. |  | Boolean
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *bufferSize* (advanced) | Set the buffer size of the websocketServlet, which is also the max frame byte size (default 8192) | 8192 | Integer
| *maxIdleTime* (advanced) | Set the time in ms that the websocket created by the websocketServlet may be idle before closing. (default is 300000) | 300000 | Integer
| *maxTextMessageSize* (advanced) | Can be used to set the size in characters that the websocket created by the websocketServlet may be accept before closing. |  | Integer
| *minVersion* (advanced) | Can be used to set the minimum protocol version accepted for the websocketServlet. (Default 13 - the RFC6455 version) | 13 | Integer
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *allowedOrigins* (cors) | The CORS allowed origins. Use to allow all. |  | String
| *crossOriginFilterOn* (cors) | Whether to enable CORS | false | boolean
| *filterPath* (cors) | Context path for filtering CORS |  | String
| *enableJmx* (monitoring) | If this option is true, Jetty JMX support will be enabled for this endpoint. See Jetty JMX support for more details. | false | boolean
| *sslContextParameters* (security) | To configure security using SSLContextParameters |  | SSLContextParameters
|===
// endpoint options: END




 

== Message Headers

The WebSocket component uses 2 headers to indicate to either send
messages back to a single/current client, or to all clients.

[width="100%",cols="10%,90%",options="header",]
|=======================================================================

|`WebsocketConstants.SEND_TO_ALL` |Sends the message to all clients which are currently connected. You can
use the `sendToAll` option on the endpoint instead of using this header.

|`WebsocketConstants.CONNECTION_KEY` |Sends the message to the client with the given connection key.

|`WebsocketConstants.REMOTE_ADDRESS` |Remote address of the websocket session.
|=======================================================================

== Usage

In this example we let Camel exposes a websocket server which clients
can communicate with. The websocket server uses the default host and
port, which would be `0.0.0.0:9292`. +
 The example will send back an echo of the input. To send back a
message, we need to send the transformed message to the same endpoint
`"websocket://echo"`. This is needed +
 because by default the messaging is InOnly.

This example is part of an unit test, which you can find
https://svn.apache.org/repos/asf/camel/trunk/components/camel-websocket/src/test/java/org/apache/camel/component/websocket/WebsocketRouteExampleTest.java[here].
As a client we use the xref:ahc-component.adoc[AHC] library which offers support
for web socket as well.

Here is another example where webapp resources location have been
defined to allow the Jetty Application Server to not only register the
WebSocket servlet but also to expose web resources for the browser.
Resources should be defined under the webapp directory.

[source,java]
-----------------------------------------------------------------------------------------------
from("activemq:topic:newsTopic")
   .routeId("fromJMStoWebSocket")
   .to("websocket://localhost:8443/newsTopic?sendToAll=true&staticResources=classpath:webapp");
-----------------------------------------------------------------------------------------------

== Setting up SSL for WebSocket Component

=== Using the JSSE Configuration Utility

The WebSocket component supports SSL/TLS configuration
through the xref:manual::camel-configuration-utilities.adoc[Camel JSSE
Configuration Utility].  This utility greatly decreases the amount of
component specific code you need to write and is configurable at the
endpoint and component levels.  The following examples demonstrate how
to use the utility with the Cometd component.

[[Websocket-Programmaticconfigurationofthecomponent]]
Programmatic configuration of the component

[source,java]
-----------------------------------------------------------------------------------------------
KeyStoreParameters ksp = new KeyStoreParameters();
ksp.setResource("/users/home/server/keystore.jks");
ksp.setPassword("keystorePassword");

KeyManagersParameters kmp = new KeyManagersParameters();
kmp.setKeyStore(ksp);
kmp.setKeyPassword("keyPassword");

TrustManagersParameters tmp = new TrustManagersParameters();
tmp.setKeyStore(ksp);

SSLContextParameters scp = new SSLContextParameters();
scp.setKeyManagers(kmp);
scp.setTrustManagers(tmp);

CometdComponent commetdComponent = getContext().getComponent("cometds", CometdComponent.class);
commetdComponent.setSslContextParameters(scp);
-----------------------------------------------------------------------------------------------

[[Websocket-SpringDSLbasedconfigurationofendpoint]]
Spring DSL based configuration of endpoint

[source,xml]
-------------------------------------------------------------------------------------------
...
  <camel:sslContextParameters
      id="sslContextParameters">
    <camel:keyManagers
        keyPassword="keyPassword">
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:keyManagers>
    <camel:trustManagers>
      <camel:keyStore
          resource="/users/home/server/keystore.jks"
          password="keystorePassword"/>
    </camel:trustManagers>
  </camel:sslContextParameters>...
...
  <to uri="websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters"/>...
-------------------------------------------------------------------------------------------

[[Websocket-JavaDSLbasedconfigurationofendpoint]]
Java DSL based configuration of endpoint

[source,java]
----------------------------------------------------------------------------------------------------------
...
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            public void configure() {
                
                String uri = "websocket://127.0.0.1:8443/test?sslContextParameters=#sslContextParameters";
                
                from(uri)
                     .log(">>> Message received from WebSocket Client : ${body}")
                     .to("mock:client")
                     .loop(10)
                         .setBody().constant(">> Welcome on board!")
                         .to(uri);
...
----------------------------------------------------------------------------------------------------------


include::camel-spring-boot::page$websocket-starter.adoc[]
