2

メッセージの配信に MSMQ を既に使用している既存のシステム ランドスケープに #Rebus をプラグインしようとしています。

もちろん、その意図は Rebus にすべてを引き継がせることです ;-) が、現時点では、MSMQ トランスポートで既に動作している既存のコードを変更することはできません。

そこで、システムの新しい部分で Rebus を使用して、既存のアプリ キューにメッセージを送信できると思ったのですが、何かがうまくいかないのです。

Rebus を次のように構成します。

_bus = Configure.With(new WindsorContainerAdapter(container))
    .Logging(l => l.ColoredConsole(LogLevel.Debug))
    .Transport(t => t.UseMsmqInOneWayClientMode())
    .MessageOwnership(d => d.FromRebusConfigurationSection())
    .Serialization(s => s.UseBinarySerializer())
    .CreateBus().Start();

計画どおりにメッセージを送信しますが、既存のアプリがキューから読み取ろうとすると、例外がスローされます。

「引数として渡されたメッセージを逆シリアル化できません。シリアル化形式を認識できません。」

問題のメソッド呼び出しは次のとおりです。

// using System.Messaging.MessageQueue
receiveQueue.Receive(_queueTimeout, transaction);

コードを掘り下げると、Rebus の DefaultFilter が多かれ少なかれ私たちのものに似ていることがわかります

https://github.com/rebus-org/Rebus/blob/1ab9b0a02883157de457e0b6106d289ace3a077e/src/Rebus.Snoop/Listeners/MsmqInteraction.cs#L567

return new MessagePropertyFilter
{
  Label = true,
  ArrivedTime = true,
  Extension = true,
  Body = true,
  Id = true,
  };

MessagePropertyFilter は次のように構成されています。

var propertyFilter = new MessagePropertyFilter
{
    Id = true,
    Body = true,
    Label = true
};

この微妙な変化が本当に例外の原因になるのでしょうか? また、BinaryFormatter を使用してメッセージをシリアル化します。

どんな助けでも大歓迎です:-)

4

1 に答える 1

2

RebusTransportMessageFormatterRebus には、MSMQ クライアントが MSMQ の実際の読み取り/書き込みを委任する独自のメッセージ フォーマッタ がありますMessage

Readフォーマッタの メソッドとメソッドを確認してくださいWrite。選択したシリアライザに関係なく、MSMQ を使用してメッセージを転送するときに Rebus が使用するロジックが含まれています。

Rebus を既存の MSMQ ソリューションで直接使用する場合、既存のソリューションは、Rebus と同じ方法で本文にメッセージをシリアル化/逆シリアル化できる必要があります。

また、Rebus がExtensionプロパティを使用してヘッダーを保存する方法にも注意してください。これはおそらく、既存の MSMQ ソリューションから Rebus にメッセージを送信できないことを意味しますExtension。Rebus は、UTF7 として解釈できるバイトのストリームがあると想定するためです。ヘッダー値のエンコードされ、シリアル化されたディクショナリ。

お役に立てれば :)

于 2014-02-05T22:53:43.493 に答える