Tôi đã nhận được một ứng dụng Web, được triển khai bằng Spring sử dụng STOMP qua Nhắn tin WebSockets, tương tự như mô tả here (với RabbitMQ ở phần cuối). Nó chạy trên Tomcat và tôi có thể kết nối với ứng dụng bằng các URL thông thường (ví dụ: http://host/server/
). Tôi cũng đã được đưa ra một khách hàng demo - một trang JSPX, sử dụng Modernizr WebSockets và SockJS. Mã kết nối trong trình khách demo giống như sau:Kết nối với Stomp qua WebSockets được triển khai bằng Spring 4 từ máy khách Java
if (Modernizr.websockets) {
socket = new WebSocket('ws://host/server/endpointx');
}
else {
socket = new SockJS('/server/endpointy');
}
stompClient = Stomp.over(socket);
stompClient.connect(headers, function(frame) { ... });
....
Trình khách demo hoạt động tốt (khi tôi tải trang JSPX trong trình duyệt, tôi có thể kết nối với máy chủ). Nhưng mục tiêu của tôi là kết nối với cùng một máy chủ bằng cách sử dụng một số thư viện Java STOMP. Vấn đề là, các thư viện tôi đã cố gắng, yêu cầu chủ và cổng như các thông số kết nối: Ví dụ với ActiveMQ Stomp library:
StompConnection connection = new StompConnection();
connection.open("host", port);
connection.connect(new HashMap<String, String>());
Nếu tôi chỉ định port
như 61613
, kết nối thành công, nhưng tôi nhấn RabbitMQ trực tiếp, không phải của tôi máy chủ (đây không phải là những gì tôi muốn). Nếu tôi chỉ định 8080
(hoặc 80
), kết nối tôi nhận được một lỗi
java.io.EOFException tại java.io.DataInputStream.readByte (Unknown Source) tại org.apache.activemq.transport.stomp .StompWireFormat.unmarshal (StompWireFormat.java:137) tại org.apache.activemq.transport.stomp.StompConnection.receive (StompConnection.java:77) tại org.apache.activemq.transport.stomp.StompConnection.receive (StompConnection .java: 68) tại org.apache.activemq.transport.stomp.StompConnection.connect (StompConnection.java:139) tại .... stomp.impl.activemq.ActiveMQStompDriver.connect (ActiveMQStompDriver.java:39) ... 25 hơn
và dấu vết cho thấy rằng điều này là do CONNECT
khung không bao giờ nhận được một dự kiến CONNECTED
khung (trong thực tế, nó không nhận được bất cứ điều gì trở lại).
Vì vậy, tôi bối rối: tôi đang sử dụng cổng sai? hoặc đối phó với một số thư viện không tương thích? hay tôi cần bằng cách nào đó chỉ ra Tomcat mà tôi muốn upgrade HTTP connection to WebSockets?
Nếu câu hỏi trên khó trả lời, thì câu hỏi này hữu ích như nhau: làm cách nào để kết nối với ứng dụng Spring với STOMP qua kênh nhắn tin WebSockets chạy trên Tomcat bằng Java?