简体   繁体   中英

Spring Websockets/Stomp upgrade to secure websockets

I have 2 Java applications that communicate using Spring websockets. I use ActiveMQ Version 5.12.3. I run the apps on a TomEE Server. This is the configuration i use in tomee.xml for ActiveMQ:

<Resource id="MyAppMessageBus" type="ActiveMQResourceAdapter">
    BrokerXmlConfig =  broker:(tcp://localhost:61616,ws://0.0.0.0:61614,stomp://0.0.0.0:61613)
    ServerUrl       =  tcp://localhost:61616
</Resource>

This is my Java code for connecting:

    if (brokerUrl.startsWith("ws")) {
        WebSocketClient transport = new StandardWebSocketClient();
        stompClient = new WebSocketStompClient(transport);
    }

    stompClient.setMessageConverter(new MappingJackson2MessageConverter());
    stompClient.setTaskScheduler(taskScheduler);
    stompClient.setDefaultHeartbeat(heartbeat);
    stompClient.connect(brokerUrl, handler);

I can connect successfully using the following broker url: ws://localhost:61614

What i would like to do, is connect using secure websockets. When i change the url in tomee.xml to use wss:// and update the brokerurl in my code, i get the following exception:

javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection failed
    at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:434) ~[tomcat7-websocket.jar:7.0.68]
    at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:152) ~[spring-websocket-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:149) ~[spring-websocket-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) ~[na:1.7.0_80]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_80]
Caused by: java.util.concurrent.ExecutionException: java.net.ConnectException: Connection refused
    at sun.nio.ch.PendingFuture.get(PendingFuture.java:202) ~[na:1.7.0_80]
    at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:376) ~[tomcat7-websocket.jar:7.0.68]
    ... 4 common frames omitted
Caused by: java.net.ConnectException: Connection refused
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_80]
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishConnect(UnixAsynchronousSocketChannelImpl.java:252) ~[na:1.7.0_80]
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:198) ~[na:1.7.0_80]
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213) ~[na:1.7.0_80]
    at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:293) ~[na:1.7.0_80]
    ... 1 common frames omitted

Does anyone know an easy way to enable secure websockets? Do i need to add an additional transport in my code or add something to my server configuration?

You need a "wss://..." transport connector on the server-side in the broker config.

See: http://activemq.apache.org/websockets.html

activemq is not supporting websocket through the standard protocol but only through jetty (see https://github.com/apache/activemq/blob/master/activemq-http/src/main/java/org/apache/activemq/transport/ws/WSTransportServer.java )

You have few options there:

  • try to add jetty jars (taking care to not add conflicting ones) in tomee/lib
  • configure an external broker (standalone activemq) and let tomee connect on it

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM