10

プロセス間クロスネットワーク メッセージングを行うための Microsoft メッセージ キューを調査しています。しかし、メッセージを受け取ったとき、取得しているオブジェクトのタイプが先験的にわからないため、コード

queue.Formatter = new XmlMessageFormatter(new Type[] { typeof(Wibble) });

それが Wibble かどうかわからないため、メッセージが表示されるまでは適用できません。では、さまざまな種類のメッセージを受信するにはどうすればよいでしょうか?

4

4 に答える 4

12

型の配列XmlMessageFormatterを受け入れるコンストラクターのオーバーロードを既に使用しています。したがって、1 つの型だけではなく、受け取ると予想されるすべての型をその配列に追加するだけです。

queue.Formatter = new XmlMessageFormatter(new Type[] {
    typeof(Wibble),
    typeof(Fleem),
    typeof(Boo)
});

からTargetTypes:

メッセージ本文でシリアル化されたインスタンスは、型配列で表されるスキーマのいずれかに準拠する必要があります。Receive メソッドを使用してメッセージを読み取ると、メソッドは、識別されたスキーマに対応する型のオブジェクトを作成し、メッセージ本文をそこに読み取ります。

(強調を追加)

于 2012-05-29T12:18:02.100 に答える
3

オブジェクトを MSMQ メッセージに保存するのではなく、可能であれば永続的な場所への参照を配置することを検討してください。MSMQ のメッセージ キューのスペースは限られているため、小さいメッセージが最適です。

それができない場合は、任意のシリアライザーを使用して、オブジェクトを直接メッセージ BodyStream にシリアライズできます。次に、タイプ名も保存します。おそらく、メッセージ ラベルに最適です。

これに非常によく似たもの (ここにスクラッチを入れました。このコンピューターには IDE はありません) を挿入し、同様のアクションを実行します。

public void FormatObject(object toFormat, Message message)
{
    var serializer = new XmlSerializer(toFormat.GetType());
    var stream = new MemoryStream();
    serializer.Serialize(toFormat, stream);

    //don't dispose the stream
    message.BodyStream = stream;
    message.Label = toFormat.GetType().AssemblyQualifiedName;
}
于 2012-05-29T12:18:09.663 に答える
1

MSMQ に関する誤った情報が大量に出回っています。その主な理由は、メッセージの送受信を適切に設計する方法に関する Microsoft のドキュメントが驚くほど少ないためです。私はこの件に関して MSMQ の本を 2 冊出版しており、インターネットで実用的なデザインを探しています。

そのため、これらの参考文献のいずれも、キュー要件に対するメッセージ タイプが 1 つであるとは述べていません。そして、それは PeakMessage とその亜種を不必要にし、ばかげたものにさえします。マイクロソフトのドキュメントは曖昧で難しいですが、私はそこで働いており、彼らは決して愚かではありません。

CLSID を識別子として使用するという刺激的な提案が常にありますが、これは迷惑なほど近視眼的な慣行です。メッセージタイプをLABELに埋め込んでみてはどうでしょうか??? 次に PeadMessage を使用して、最初の試行でメッセージを適切に受信するためにメッセージ プロパティをフォーマットするために使用できる、特定のキュー用に明確に意図されたメッセージ タイプを含むメッセージが見つかるまで、キューを実行しますか???

これが複雑なコード セットになることは承知していますが、せずに済むでしょうか? それとも、200 のメッセージ タイプを持つ 200 人のユーザーのシステムがある場合、1 対 1 のすべての要件を管理するために 80,000 のキューを作成する必要があることを示唆している上記のレスポンダーの提案を実際に実装しようとしますか? これらのことをよく考えていない人もいます。

于 2013-10-21T23:04:07.597 に答える
0

joocerがコメントで指摘しているように、メッセージの種類ごとに異なるキューを使用してください。

または、すべてのメッセージが XML であることにメッセージ送信者に同意することもできます (XML として解析されないものはすべて拒否されます)。次に、XML スキーマのいくつかの基本、つまりメッセージ タイプ (およびバージョン) を持つヘッダー要素にも同意します。

次に、内部型に (シリアライザーを介して) 処理します。

もちろん、デシリアライゼーションに実際のメリットがない多くの場合、必要に応じて XML のコンテンツを読み取るだけです。

于 2012-05-29T12:19:11.640 に答える