3

プロセス間通信に ZeroMQ ソケットを使用する Java プログラムがあります。私はいくつかの高価な作業を行うスレッドワーカーを持っており、彼らが結果で作業を終えると、その結果オブジェクトをインプロセスソケットを介して「送信者」スレッドに渡し、オブジェクトをクライアントに送信できるようにします。私は例を見てきました.C++では、これは通常ポインターを使用して行われますが、Javaではポインターがなく、オブジェクトを別のスレッドに渡すためだけにオブジェクトをシリアライズしたくありません.

私にはどのような可能性がありますか?文字列やプリミティブ型などの「軽量」値のみを効率的にソケットに渡すことができます。

ありがとう!

4

3 に答える 3

3

参照またはポインターを渡すかどうかは、ほとんど同じです。データ構造を介して同じプロセス内のスレッド間で渡すことはできますが、ソケットを介して渡すことはできず、別のプロセスで動作することを期待できません。

つまり、同じプロセス内のスレッド間で参照 (またはポインター) を渡すには、ZeroMQ を使用せず、代わりに BlockingQueue のようなものを使用します。

于 2013-01-31T17:23:48.727 に答える
0

私も同じ疑問を持っています。zeromqを介して別のプロセスへの参照を送信することではありません。それは決してうまくいきません。問題は、インプロセス ワーカー スレッドの場合です。メッセージの送信はシリアライズとデシリアライズを意味します。文字列とプリミティブ型の場合は些細なことですが、大きなビジネス オブジェクトの場合は意味がありません (トリックを見逃していない限り)。

もう 1 つの回避策は、ワーカー スレッドによってビジネス オブジェクト (またはこの場合は結果) をキャッシュに格納し、インデックスを "送信者" スレッドに渡すことです。この「送信者」スレッドはキャッシュから結果を取得し、それを「クライアント」に送信します。

ただし、これが意図された目的であるかどうかはわかりません。この同じフォーラムに同じクエリを投稿しました。

于 2013-02-04T03:43:37.057 に答える
0

私も同様の状況ですが、クライアントとサーバーは異なるプラットフォームでは異なる言語で記述されているため、オブジェクトをシリアライズします。また、メッセージを印刷する単純なプロキシを使用してメッセージをデバッグすることもできます。

私はXStreamを使用してオブジェクトを JSON または XML 文字列としてシリアライズ/デシリアライズしますが、これは非常に使いやすいものです。

別の解決策はGSonですが、JVM のタイム ゾーンで日付をシリアル化し、異なるタイム ゾーンで実行されているコンピューターとの間でメッセージを送受信する必要があることがわかりました。XStream はデフォルトのタイムゾーンとして GMT を使用します。

于 2013-02-01T17:10:55.730 に答える