浏览器客户端是否有办法通过websockets通过Tomcat / Jetty服务器连接并将JMS连接传递给ActiveMQ服务器?
我们希望将我们的JMS服务器保留在防火墙之后,但允许已连接到我们的Tomcat应用程序服务器的客户端通过认为同一主机的websockets连接到ActiveMQ。
答案 0 :(得分:2)
JMS是客户端API,而不是协议。
使用ActiveMQ JMS客户端,您将使用OpenWire,它不能通过websocket发送(没有主要的编码练习)。您可以做的是代理其中一个实际上与websockets兼容的传输 - MQTT或STOMP。
我建议在你的网络应用程序(tomcat)和ActiveMQ前面使用一些轻量级反向代理。这可能是Apache httpd或Nginx。即使没有websockets,使用一些经过强化处理的Web代理保护您的Java服务器也是一个好主意。
我已经通过WebSocket上的Web服务器Nginx和MQTT做了这样的事情,它运行得很好。虽然我猜Stomp over WebSocket没什么区别。不错的是,您还可以在代理服务器中轻松终止SSL,这通常比在应用服务器中更快/更容易。
这对在客户端使用JMS api没有帮助。不确定是否有任何生产准备就绪。但是,跳过JMS规范并在Websocket客户端上使用STOMP应该这样做。
示例Nginx配置代理WebSocket(在这种情况下终止SSL / TLS),例如ActiveMQ服务器。
upstream websocket {
server example.com:61623;
}
server {
listen 8883 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl/bundle2015.cer;
ssl_certificate_key /etc/nginx/ssl/server2015.key;
location / {
proxy_pass http://websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection upgrade;
proxy_read_timeout 120s;
}
}