2016-08-08 7 views
18

here(バックエンドではRabbitMQを使用)と同様にWebアプリケーションを受信しました。 Tomcat上で動作し、通常のURL(例:http://host/server/)を使用してアプリケーションに接続できます。また、Modernizr WebSocketsとSockJSを使用するJSPXページのデモクライアントも提供されました。デモクライアントの接続コードは次のようになります。JavaクライアントからSpring 4を使用して実装されたWebSocketを介してStompに接続

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) { ... }); 
.... 

デモクライアントが正常に動作します(私はブラウザでJSPXページをロードするとき、私は、サーバーに接続することができます)。しかし私の目標は、いくつかのJava STOMPライブラリを使用して同じサーバに接続することです。私は61613としてportを指定した場合

StompConnection connection = new StompConnection(); 
connection.open("host", port); 
connection.connect(new HashMap<String, String>()); 

、接続は成功しますが、私は、直接のRabbitMQのないヒット:ActiveMQ Stomp libraryでたとえば:問題は、私が試したライブラリは、接続パラメータとしてホストポートを必要とし、ありますサーバー(これは私が望むものではありません)。私はjava.io.DataInputStream.readByteでjava.io.EOFException (不明なソース) はorg.apache.activemq.transport.stompで、私はエラー

を取得する接続で、8080(または80)を指定した場合org.apache.activemq.transport.stomp.StompConnection.receiveでorg.apache.activemq.transport.stomp.StompConnection.receive(StompConnection.java:77) で.StompWireFormat.unmarshal(StompWireFormat.java:137) (StompConnection .java:68) at org.apache.activemq.transport.stomp.StompConnection.connect(StompConnection.java:139) at .... stomp.impl.activemq.ActiveMQStompDriver.connect(ActiveMQStompDriver.java:39) ... 25もっと

とトレースがCONNECTフレームが予想CONNECTEDフレーム(実際には、それは何も戻って受信しない)を受けたことがないので、これがあることを示しています。

私は困惑しています。間違ったポートを使用していますか?ライブラリの互換性に問題がありますか?または私は何とかTomcatに私がupgrade HTTP connection to WebSocketsにしたいことを示す必要がありますか?

上記の質問に答えることが難しい場合は、これも同様に便利です:Javaを使用してTomcat上で動作するWebSocketsメッセージングチャネル上のSTOMPでSpringアプリケーションに接続するにはどうすればよいですか?

答えて

0

Webアプリケーションを受け取りました.WebSockets Messaging上のSTOMPを使用してSpringで実装されています(ここでは、RabbitMQをバックエンドで使用しています)。 Tomcat上で動作し、通常のURL(例:http://host/server/)を使用してアプリケーションに接続できます。

これは単に、後の答えでは参考値です。

Browser -> WebSocket -> Spring STOMP Broker Relay -> RabbitMQ 

実施例では、エンドユーザーのブラウザにJavscriptクライアントを作成します。これはWebSockets経由でTomcatサーバー&にあなたのアプリのSpring STOMP Broker Relayを接続します。リレーは、その名前が示すように、WebSocket経由で受信したSTOMPメッセージを、RabbitMQに接続されている実際のソケット(STOMP経由でも)にリレーします。

私は、Modernizr WebSocketsとSockJSを使用するデモクライアント - JSPXページも提供されました。

答えには関係ありませんが、WebSocketがクライアントブラウザでサポートされているかどうかを確認する必要はありません。 SockJSはあなたのためにこれを行い、自動的に使用する最良のチャンネルを選択します。制限付きプロキシの背後にない現代的なブラウザでは、WebSocketになります。

私の目標は、いくつかのJava STOMPライブラリを使用して同じサーバーに接続することです。問題は、私が試したライブラリで、接続パラメータとしてホストとポートが必要です。

Java STOMPクライアントは、このシナリオでは動作するように設計されているとは思っています。 通常はです。Java STOMPクライアントは、サーバー側またはSTOMPサーバーに直接接続する場所を実行します。その場合、RabbitMQに直接接続することを意味します。

ラビットに直接接続できることに言及していますので、ここでは解決策の1つになると言いました(あなたはこれをしたくないと言っていましたが、その理由をコメントで明示してください)。コードがサーバー側で実行されている場合、これは間違いなく道のりです。 WebSocketチャネルとSpringブローカリレーを経由すると、追加のホップと不要な待ち時間が追加されます。

もう1つの解決策は、Webソケット& STOMPを介して通信できるJavaクライアントを使用することです。あなたのJavaコードがどこかでリモートクライアントとして実行されていて、RabbitMQに直接アクセスできるアクセス権がない場合は、これをお勧めします。

私は間違ったポートを使用していますか?ライブラリの互換性に問題がありますか?または何らかの形でTomcatにHTTP接続をWebSocketにアップグレードしたいことを示す必要がありますか?

61613は、あなたがしたいことがあれば、RabbitMQと直接通信するための正しいポートです。 WebSocket接続を確立するポートは、Tomcatが接続をリスンする標準のHTTPまたはHTTPSポートです(デフォルトは8080/8443)。 STOMPをTomcatに直接話すことはできませんが、そのプロトコルは理解できません。 WebSocket接続を開始してから、STOMPをアプリケーション(つまり、Spring STOMPブローカリレー)に話す必要があります。

これを行うには、WebSocketチャネルでSTOMPを使用できるクライアントをWebSocket &と話す方法を知っているクライアントが必要です。現在のクライアントはWebSocket接続ではなくTomcatへの通常のソケット接続を試みています。成功するためには、最初にWebSocket接続を開始し、WebSocket接続を介してSTOMPメッセージを送信する必要があります。

ブラウザでデモを実行すると、WebSocket接続はブラウザとSockJSによって処理され、Javascript STOMPクライアントはSTOMP経由でWebSocket接続を介してアプリケーションと会話します(上のASCIIダイアグラムを参照)。

上記の質問に答えることが難しい場合、これも同様に便利です。Javaを使用してTomcat上で動作するWebSocketsメッセージングチャネル上のSTOMPでSpringアプリケーションに接続するにはどうすればよいですか?

これは通常はやりたくないと思います。TomcatでJavaコードを実行している場合、Java STOMPクライアントとRabbitMQ(つまりSTOMPサーバー)を直接接続する方が効率的です。

STOMP over WebSocketsは主に、リモートで実行されているブラウザベースのクライアントがRabbitMQサーバーに直接アクセスすることなく、簡単かつ安全にメッセージに接続して送信できるようにします。

希望に役立ちます!

関連する問題