メッセージキューMSMQのWCF(1)

I.はじめに

  Windows通信基盤(WCF)建物サービス指向アプリケーションのための統一プログラミングモデル、マイクロソフトが提供されている、サービスモデルは、疎結合とバージョン管理のシリアライズ機能のサポートを提供し、メッセージキュー(MSMQ)、COM +を、提供Microsoftの既存の分散システム技術としてAsp.net Webサービス、.NETリモート処理。WCFのプラットフォームを使用し、開発者が容易に構築することができ、サービス指向アプリケーション(SOA)。考えることができ、WCFは、既存の分散技術、その場合には、我々は最初の前に、分散技術を理解する必要があります統合と拡張(MSMQ、.NETリモート処理、およびWebサービス技術を参照)の前にある、唯一の方法より深くWCFによってもたらされる利点を理解するためです。技術の共有、今日のような分散MSMQの下で。

二、MSMQ導入

   MSMQはMicrosoftメッセージQueue-- Microsoftメッセージキューの略です。これは、非同期転送モードで、異なるアプリケーションの間で相互に通信することができ、アプリケーションが同じマシン上に分散互いに通信することができ、スペースはまた、任意の位置に結合されたネットワーク上に分散することができます。

2.1 MSMQは2作品

  MSMQ原理は次のとおりです。彼らは情報がコンテナに送信するメッセージの送信者、およびメッセージ・キュー・スペース、共通のシステム、キューから取り出し、再び送信され、ローカルまたはリモートメッセージ受信プログラムにそれを保存処理のために、それへのメッセージ。

  メッセージキューは、したがって、物理メモリ内またはファイル内に存在する二つの方法、すなわち、回収及び宅配便モードでメッセージを送信することができる共通のメモリ空間です。両者の差はすぐにメッセージを配信するために、宅配便のメッセージ記憶場所異なるので、メッセージは、より高い処理能力を得るために、メモリ内ではなく、物理ディスク上に配置され、かつ送信モード中に復元します格納されたメッセージ・キューと再起動マシンが失敗した場合、メッセージは、より良い回復を得るために前に故障送信されたメッセージの状態に戻すことができるように、各ステップにおいて、メッセージは、物理ディスクとみなすために書かれています。また、別のマシン上で別々に配置することができる受信機がマシン上に配置され、メッセージキューの送信者に配置することができます。また、メッセージ・キュー・メカニズムの使用は、送信者がこのような障害などの要因が発生したかどうかを、受信者が開始されているかどうかを心配する必要があり、限りメッセージが正常に送信されたとして、それが処理さと考えることができない、実際には他の側にさえなかったり、お互いに実際のメッセージそれは次の日になることがあります。MSMQメカニズムと同様のQQのメッセージパッシングメカニズム。下の図は、MSMQの原則の実装を示しています。

 

MSMQは、主に2つの概念を持っています。

  • 一つは、メッセージのメッセージです:メッセージは、通信当事者がその上のテキスト、画像、ビデオ、およびすることができ、合格する必要があるメッセージです。メッセージは、指定したユーザーがメッセージを取得することができ、送信者と受信者の身元が含まれています。

  • キューキューです:メッセージを格納するために使用されるストレージ容量、MSMQキューは、主に以下のような種類がありますキューは、マシンフォーマットに対応するログ:マシン名\ジャーナル$;

  • フォーマットに対応した機械不能キュー:マシン名\ $のdeadletter。

  • チャンネル・フォーマットに対応した機械不能キュー:マシン名\ XactDeadletter $。

  • パブリックキュー:コピー、メッセージキューネットワーク全体のすべてのサイトへのアクセスのネットワークによってそこに接続することができます。パス形式:マシン名\キュー名

  • プライベートキュー(またはと呼ばれる専用キューは):ローカルコンピュータがプライベートキューは唯一のフルパス名またはラベルを知っているアプリケーションキューによってアクセスすることができ、存在するだけで利用可能ですネットワーク全体を、公開していません。パス形式:プライベート$ \キュー名\マシン名

  • キューのログ:受信確認「メッセージ受信送信されたメッセージキュー」与えられたが含まれています。フォーマットの中:マシン名\キュー名\ $ジャーナル

  • 応答キューは:アプリケーションがターゲット・アプリケーションは、メッセージ、ログ・キュー、トランザクションマシンとマシン不能キュー不能キューを含む機械を受信含まれている場合に送信されたメッセージに対する応答を返します。

キュー2.2参照説明

  メッセージキューのインスタンスを作成した後、および.NETで指定されたメッセージキュー3のアクセス方式と通信しているキューを示さなければなりません。

  • パスを使用して、Pathメッセージキューが一意に決定されたキュー名とコンピュータ名は、パスが使用するメッセージ・キューのメッセージキューを示すために使用することができます。

  • 形式を使用して名前(形式名)、メッセージキューはMSMQによって作成されたときに生成される一意の識別子である、使命を指定するようにユーザーに役立ちますが、自動的にキューマネージャGUIDによって生成されます。

  • メッセージキューが意味を持つメッセージマネージャ名で指定されたときに作成され、識別名(ラベル)を使用します。

メッセージキューの第三に、長所と短所

   それは非同期通信であるため、いずれかの送信者や受信者が他の成功メッセージを返すために異なる待ち時間で、コードの残りの部分を実行することができ、プロセスを大幅に拡張されているため、情報伝達のプロセスを、障害回復を持つ:メッセージキューを使用する利点があります容量; MSMQメッセージパッシング機構は、通信相手が可能な異なる物理プラットフォームを有するようなものです。

  メッセージキューの欠点がある:リアルタイムのインタラクティブなクライアントサーバー側には適していません必要に応じて、多数の要求、応答が遅延することができるとき。クライアントの場合は、Windowsシステムでなければなりません。これは、他の非マイクロソフトのテクノロジとのコネクタを介して統合することができます。

第四に、MSMQを使用して分散アプリケーションの開発

4.1環境の準備

   .NETプラットフォームの開発でMSMQするには、メッセージキューをインストールする必要があり、あなたは、コントロールパネル開く必要があります - >プログラム - > [Windowsの機能をオンにし、以下に示すように、メッセージキューサービスに特定の操作をすべてのオプションをチェックします。

  [OK]をクリックした後に完了したことを確認した後、私のコンピュータは、することができます - - 次のメッセージ・キュー・マップ>>管理を参照 - > [サービスとアプリケーションを:

  この数字は、あなたが成功した開発環境を構成しているMSMQを表し上で、次のVisual Studio開発を使用することができます参照してください。操作コードキューの特定のタイプのために、インストールの種類に対応するキューを成功しなければならない、ということに注意してください。

 

MSMQを使用した分散アプリケーションの開発4.2

  まず、サーバー側。コンソールプロジェクトを作成し、System.Messagingの参照を追加し、すべてのようなメッセージキューがSystem.Messaging.dllプログラムのエピソードにパッケージするので。詳細なサーバコード次のように:

1 using System;
2 using System.Messaging;
3
4 namespace MSMQServer
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 // 创建一个公共队列,公共队列只能创建在域环境里
11 //if (!MessageQueue.Exists(@".\LearningHardMSMQ")) // 判断此路径下是否已经有该队列
12 //{
13 // using (MessageQueue mq = MessageQueue.Create(@".\LearningHardMSMQ"))
14 // {
15 // mq.Label = "LearningHardQueue"; // 设置队列标签
16 // Console.WriteLine("已经创建了一个公共队列");
17 // Console.WriteLine("路径为:{0}", mq.Path);
18 // Console.WriteLine("队列名字为:{0}", mq.QueueName);
19 // mq.Send("MSMQ Message", "Leaning Hard"); // 发送消息
20 // }
21 //}
22
23 //if (MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
24 //{
25 // 删除消息队列
26 // MessageQueue.Delete(@".\Private$\LearningHardMSMQ");
27 //}
28 // 创建一个私有消息队列
29 if (!MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
30 {
31 using (MessageQueue mq = MessageQueue.Create(@".\Private$\LearningHardMSMQ"))
32 {
33 mq.Label = "LearningHardPrivateQueue";
34 Console.WriteLine("已经创建了一个私有队列");
35 Console.WriteLine("路径为:{0}", mq.Path);
36 Console.WriteLine("私有队列名字为:{0}", mq.QueueName);
37 mq.Send("MSMQ Private Message", "Leaning Hard"); // 发送消息
38 }
39 }
40
41 // 遍历所有的公共消息队列
42 //foreach (MessageQueue mq in MessageQueue.GetPublicQueues())
43 //{
44 // mq.Send("Sending MSMQ public message" + DateTime.Now.ToLongDateString(), "Learning Hard");
45 // Console.WriteLine("Public Message is sent to {0}", mq.Path);
46 //}
47
48 if (MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
49 {
50 // 获得私有消息队列
51 MessageQueue mq = new MessageQueue(@".\Private$\LearningHardMSMQ");
52 mq.Send("Sending MSMQ private message" + DateTime.Now.ToLongDateString(), "Leaning Hard");
53 Console.WriteLine("Private Message is sent to {0}", mq.Path);
54 }
55
56 Console.Read();
57 }
58 }

59 }

  服务器端代码需要注意的是,公共队列只能在域环境中创建,由于我的个人电脑没有加入域环境,所以不能创建公共队列,从开始的消息队列的截图也可以看出,在图中并没有安装公共队列。

  实现完服务器端之后,自然就是完成客户端。MSMQ程序的原理主要是:服务器端把消息发送到共享的消息队列中,然后,客户端从这个共享的消息队列中取出消息进行处理。具体客户端的实现代码如下所示:

1 using System;
2 using System.Messaging; // 需要添加System.Messaging引用
3
4 namespace MSMQClient
5 {
6 class Program
7 {
8 static void Main(string[] args)
9 {
10 if (MessageQueue.Exists(@".\Private$\LearningHardMSMQ"))
11 {
12 // 创建消息队列对象
13 using (MessageQueue mq = new MessageQueue(@".\Private$\LearningHardMSMQ"))
14 {
15 // 设置消息队列的格式化器
16 mq.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
17 foreach (Message msg in mq.GetAllMessages())
18 {
19 Console.WriteLine("Received Private Message is: {0}", msg.Body);
20 }
21
22 Message firstmsg = mq.Receive(); // 获得消息队列中第一条消息
23 Console.WriteLine("Received The first Private Message is: {0}", firstmsg.Body);
24 }
25 }
26 Console.Read();
27 }
28 }
29 }

4.3 运行演示

  经过上面步骤,我们已经完成了MSMQ分布式程序的实现了,下面看看如何运行该程序来查看效果。

  首先,自然要启动服务器,右键MSMQServer项目->调试->启动新实例来启动服务器,具体步骤如下图所示:

 

  

运行成功之后,你将到服务器发送消息成功的控制台界面,效果图如下所示:

  接下来运行客户端来从消息队列中取得消息并显示在控制台中,采用和服务器相同的方式来启动客户端,右键MSMQClient->调试->启动新实例,看到客户端的效果如下图所示:

  从上图可以看出,客户端确实成功地取得了消息队列中的消息。

    以上MSMQ程序需要特别注意是:MessageQueue.Receive()是取出消息队列中队列中的第一条消息,并从消息队列中移除它(MSDN中文翻译上是错误,MSDN写的是不移除,而英文原文是移除),而实际结果也是移除的,如果你再运行一次客户端时,你会发现消息队列中只有一条消息,具体运行效果如下图所示:

五、总结

   到这里,MSMQ的内容就分享结束, 其MSMQ的实现原理也非常简单,一句话慨括就是服务器把消息放在一个公共的地方,这个地方叫做消息队列,而其他客户端可以从这个地方取出消息进行处理。下一章将分享.NET 平台上另外一种分布式技术——.NET Remoting。

 

转自:https://www.cnblogs.com/zhili/p/MSMQ.html,作者:Learning hard

如有侵权,请联系我删除!

おすすめ

転載: blog.csdn.net/IT_0802/article/details/91493162