0

Azure サービス バス経由で amqp を使用して、単純な文字列メッセージを .NET から Java クライアントに送信しようとしています。ドキュメントによると、次のような仲介メッセージを送信できるはずです。

message = new BrokeredMessage("this is a text string");

Java クライアントに TextMessage (javax.jms.TextMessage) として表示されます。ただし、JavaでメッセージをTextMessageとしてキャストしようとすると、jms.impl.BytesMessageImplをTextMessageに変換できないという例外が発生します。メッセージが TextMessage ではなく BytesMessage のように見える理由を知っている人はいますか?

ドキュメントによると、BytesMessage は次のように構築されます。

byte[] bytes = { 33, 12, 45, 33, 12, 45, 33, 12, 45, 33, 12, 45 };
message = new BrokeredMessage(bytes);

私がしていないこと....

誰でもこのようなことをする方法を知っていますか?

[更新] 興味深いことに、接続文字列に TransportType=Amqp を指定した場合と指定しない場合の送信コードをテストしました。MessagingFactory 設定も毎回正しいトランスポート タイプに設定されていることを実行中にコードを確認しました。どのトランスポート タイプを使用しても、メッセージは BytesMessage として Java アプリに届きます。メッセージのバイトを見ると、メッセージの送信方法に関係なく、同じ結果が得られます。

@ string 3http://schemas.microsoft.com/2003/10/Serialization/�&BLABLA this is a message

[UPDATE2] 問題の根本原因を突き止めました。私のセットアップでは、メッセージをキューに転送するサブスクライバーがあります。これは、メッセージが台無しになっている場所のようです。AMQP メッセージをキューに直接送信すると、Java アプリに TextMessage として届きます。AMQP を介してトピックにメッセージを送信し、サブスクライバー (フィルターを使用) を介してキューに転送されると、BytesMessage にマングルされます。

では、どうすればこれを適切に機能させることができますか? これが機能するように、キューに転送するサブスクライバーをセットアップする方法はありますか?

4

2 に答える 2

1

現在、転送ルールを使用する場合の Service Bus AMQP 相互運用性ストーリーには制限があります。転送中に、データ コントラクト シリアライザーを使用して、メッセージが誤って再シリアル化されています。私たちはその問題に対処し、それが完了したらここで報告します. 当面の回避策として、メッセージ プロパティを使用して、本文ではなくアプリケーション データを格納することが考えられます。つまり、本文を使用するのではなく、メッセージの文字列プロパティを使用して重要な情報を格納します。


よろしく、
デイブ。
Service Bus チーム

于 2013-11-18T05:34:01.757 に答える
1

あなたが書いたコードは正しいようです。私が考えられる唯一のことは、AMQP サポートが追加される前に発行された古いバージョンの .NET SDK を使用していることです。http://www.nuget.org/packages/WindowsAzure.ServiceBus/の最新の Service Bus SDK でコードを試すことができますか。

よろしく、
デイブ。
(サービスバスチーム)

于 2013-09-02T17:54:52.970 に答える