ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل بیست و هشتم صف بندی پیام در #C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0; mso-gutter-direction:rtl;} div.Section1 {page:Section1;} -->

فصل بیست و هشتم

  C#       صف بندی پیام در

این فصل عناوین زیر را بررسی میکند:

MQ  مروری بر 1

MQ  معماری

ابزار مدیریت صف بندی پیام

برنامه نویسی صف بندی پیام

برنامه کاربردی تکلیف درس 2

-1-28 مقدمه

سیستمعامل ویندوز MQ یک فضای نامی است که کلاسهایی برای خواندن و نوشتن پیغام با قابلیت System.Messaging

را در بر دارد. پیامرسانی میتواند در یک سناریوی ارتباط منفصل 3 بکار رود، جایی که لازم نیست سرویسدهنده و

سرویسگیرنده همزمان در حال اجرا باشند.

قبل از وارد شدن به برنامهنویسی صفبندی پیام، این بخش مفاهیم اساسی پیامرسانی را مورد بحث قرار میدهد و آن را با

برنامهنویسی همگام وغیرهمگام مقایسه میکند. در برنامهنویسی همگام زمانی که یک متد احضار میشود، فراخواننده باید

منتظر بماند تا زمانی که متد فراخوانی شده خاتمه یابد. در برنامهنویسی غیرهمگام، ریسمان فرخوانی کننده بطور همزمان با

متد فراخوانی شده اجرا میشود. برنامهنویسی غیرهمگام به وسیلهی نمایندهها، کتابخانههای کلاسی که متدهای غیرهمگام

یا با استفاده از ریسمانهای سفارشی انجامپذیر است. در هر دو مورد (System.IO ,System.Net) را پشتیبانی میکنند

برنامهنویسی همگام و غیرهمگام، باید سرویسگیرنده و سرویسدهنده به طور همزمان در حال اجرا باشند.

اگرچه صفبندی پیام بطور ناهمگام کار میکند، اما چون سرویسگیرنده جهت خواندن دادههای ارسال شده منتظر

سرویسدهنده نمیماند، یک تفاوت اساسی بین صفبندی پیام و برنامهنویسی غیرهمگام وجود دارد. صفبندی پیام میتواند

در یک محیط ارتباط منفصل نیز انجام شود. زمانی که داده ارسال میشود، گیرنده میتواند روی خط نباشد. سپس زمانی که

گیرنده روی خط میرود، بدون فرستادن درخواست، دادهها را دریافت میکند.

شما میتوانید برنامهنویسی ارتباط متصل و منفصل را با صحبت کردن یک فرد روی تلفن و ارسال یک پست الکترونیکی

مقایسه کنید. زمان صحبت کردن فردی روی تلفن، هر دو نفر باید در یک زمان متصل باشند. این ارتباط به صورت همگام

است. در پست الکترونیکی فرستنده مطمئن نیست که چه زمانی به پست الکترونِکی فرستاده شده رسیدگی میشود.

1 Message queuing

2 Course order

3 Disconnected

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

530

مطمئناً این امکان وجود دارد که به پست الکترونیکی فرستاده شده، هیچ وقت رسیدگی نشود و ممکن است چشمپوشی

شود. این طبیعت ارتباط منفصل است. برای پرهیز از این مشکل، تقاضای یک جواب جهت تأیید خوانده شدن پست

الکترونیکی امکانپذیر میباشد. اگر در یک محدودهی زمانی جواب داده نشود، ممکن است با این استثنا روبرو شده باشید.

این عمل با صفبندی پیام امکان پذیر است.

در بعضی موارد صفبندی پیام همانند پست الکترونیکی برای ارتباط برنامه با برنامه، به جای ارتباط شخص با شخص است. با

این وجود، صفبندی پیام ویژگیهایی که سرویسهای پست الکترونیکی ندارد: همچون تحویل تضمینی، تراکنشها، تأییدها،

مد ویژه با استفادهی حافظه وغیره را در بر میگیرد. همانطور که در بخش بعدی خواهید دید، صفبندی پیام تعداد زیادی

ویژگی مفید برای ارتباط بین برنامههای کاربردی دارد.

1 یک - با صفبندی پیام میتوانید در یک محیط منفصل یا متصل، پیامهایی را ارسال، دریافت و مسیریابی کنید. شکل 28

روش ساده از کاربرد پیامها را نشان میدهد. فرستنده پیامها را به صف پیام ارسال میکند و گیرنده پیامها را از صف دریافت

میکند.

1- شکل 28

-1-1-28 چه زمانی صفبندی پیام را به کار ببریم؟

یکی از مواردی که صفبندی پیام توصیه میشود، زمانی است که بیشتر مواقع برنامهی کاربردی سرویسگیرنده از شبکه

منفصل است(برای مثال: بررسی مشتریان روی سایت توسط کارشناس فروش). کارشناس فروش میتواند دادههای سفارش را

مستقیماً در سایت مشتری وارد کند. برنامه کاربردی برای هر سفارش یک پیام به صف پیام ارسال میکند، که روی سیستم

سرویسگیرنده قرار میگیرد. به محض اینکه کارشناس فروش به اداره بر میگردد، سفارش جهت مدیریت به طور اتوماتیک

از صف پیام سیستم سرویسگیرنده به سیستم مقصد منتقل میشود. سیستم مقصد جایی است که پیام پردازش میشود.

2- شکل 28

جهت دسترسی به Pocket Windows علاوه بر استفاده از یک کامپیوتر کیفی، کارشناس فروش میتواند یک دستگاه

صفبندی پیام به کار برد.

.(3- صفبندی پیام در محیطهای متصل نیز میتواند مفید واقع شود. یک سایت تجارت الکترونیکی را تصور کنید(شکل 28

جایی که سرور در زمانهای قطعی مانند عصر هر روز یا آخر هفته، تراکنشها را به طور کامل بارگذاری میکند، اما سرعت

بارگذاری در شب پایین است. یک راهحل، خرید یک سرور با سرعت بالاتر یا اضافه کردن سرورهای اضافی به سیستم برای

فصل بیست و هشتم ص فبندی پیام

531

اداره کردن ترافیک بالا است. اما یک راهحل ارزانتر نیز وجود دارد: بارگذاریهای لحظات پرترافیک را با انتقال تراکنشها از

زمانهای شلوغ به زمانهای خلوت، یکنواخت کنید. در این طرح، سفارشات به صف پیام ارسال میشوند و طرف گیرنده

سفارشات را با نرخ کاراتر از سیستم پایگاه داده میخواند. اکنون بار سیستم در کل زمان پخش میشود: بنابراین کار کردن

سرور با تراکنشها، میتواند از ارتقا دادن سرورهای پایگاه داده ارزانتر باشد.

3- شکل 28

-2-1-28 ویژگیهای صفبندی پیام

صفبندی پیام بخشی از سیستمعامل ویندوز است. ویژگیهای اصلی این سرویس به صورت زیر است:

پیامها میتوانند در یک محیط منفصل ارسال شوند. لازم نیست برنامههای کاربردی ارسال و دریافت به طور همزمان

در حال اجرا باشند.

در مد ویژه،پیامها میتوانند بسیار سریع ارسال شوند. پیامهای مد ویژه فقط در حافظه ذخیره میشوند.

در یک مکانیزم قابل ترمیم، ارسال پیامها میتواند با استفاده از تحویل تضمینی انجام شود. پیامهای قابل ترمیم در

فایلها ذخیره میشوند. حتی در مواردی که سیستم راهاندازی مجدد میشود، پیامها تحویل میگردند.

ها میتوان مشخص کرد که ACL ها امنیت پیامها را کنترل کنند. به وسیلهی ACL • صفهای پیام میتوانند از طریق

کدام کاربر میتواند پیامها را به یک صف ارسال یا از آن دریافت کند. همچنین جهت جلوگیری از استراق سمع در

شبکه میتوان پیامها را رمزنگاری کرد.

جهت ارسال سریعتر بخشهای خاص با اولویت بالاتر، میتوان از اولویتها در اداره کردن پیامها استفاده کرد.

ارسال پیامهای چندپخشی را کنترل میکند. MQ3,0 •

در ادامهی این فصل نحوهی استفاده از این ویژگیها بررسی میشود.

-3-1-28 محصولات صف بندی پیام

و پیامهای HTTP وجود دارد که پروتکل MQ نسخه 2,0 Win میباشد. در 2000 Win2003 Server و WinXP بخشی از MQ3,0

Add- از طریق WinXP را به عنوان بخشی از سیستمعامل نصب کرد. در MQ چندپخشی را پشتیبانی نمیکند. میتوان 3,0

را انتخاب کنید. قطعات زیر Message Queuing گزینهی Windows Componets و قسمت Remove Program

انتخاب شوند: Message Queuing میتوانند در تنظیمات

لازم است. MQ برای عملکرد پایهای Common زیر قطعهی :Common

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

532

نوشته میشوند. با این Active Directory در این روش اسامی پیامها به : Active Directory Integration

امکان پذیر است و میتوان صفها را در برابر گروهها و کاربران Active Directory گزینه یافتن صفها در مجتمع

ویندوز ایمن کرد.

ممکن میسازد. HTTP ارسال و دریافت پیامها را از طریق پروتکل :MsMQHTTP Support

باید سرویس ،MQ میتوانند با دریافت یک پیام جدید اجرا گردند. بعد از نصب Triggers برنامههای کاربردی :Triggers

4). این سرویس پیامها را خوانده و مینویسد و برای مسیریابی پیامها در طول شبکه با - آن راهاندازی گردد (شکل 28

دیگر ارتباط برقرار میکند. MQ سرورهای

4- شکل 28

MQ -2-28 معماری

پیامها از صف پیام خوانده شده یا به صف پیام نوشته میشوند. پیامها و صفهای پیام خصوصیات متعددی MQ بوسیلهی

دارند که در ادامه به دقت شرح داده خواهند شد.

-1-2-28 پیامها

یک پیام به یک صف پیام ارسال میشود. هر پیام یک بدنه برای دربرگرفتن دادهی اصلی و یک برچسب برای عنوان پیام

چندین فرمتدهنده، دادهها را برای ،NET. دارد. هر نوع اطلاعاتی میتواند در بدنهی پیام قرار گیرد. بوسیلهی کلاسهای

گذاشتن در داخل بدنه پیام تبدیل میکنند. علاوه بر بدنه و برچسب، پیام اطلاعات بیشتری در مورد فرستنده، پیکربندی

مهلت پایان، شناسهی تراکنش یا اولویت را در بردارد.

صفهای پیام چندین نوع پیام دارند:

پیام عادی: به وسیلهی یک برنامه کاربردی ارسال میشود.

پیام اعلام وصول: حالت یک پیام عادی را گزارش میدهد. پیامهای اعلام وصول جهت گزارش موفقیت یا عدم موفقیت

ارسال پیامهای عادی به صفهای مدیریت ارسال میشوند.

پیامهای جواب: در صورتیکه فرستندهی اصلی به پاسخ خاصی نیاز داشته باشد، از طریق گیرنده ارسال میشود.

فصل بیست و هشتم ص فبندی پیام

533

تولید میشود. پیامهای آزمایش و پیامهای پیگرد به این دسته تعلق دارند. MQ • پیام گزارش: بوسیلهی سیستم

یک پیام میتواند اولویت داشته باشد، تا ترتیب خواندن پیامها از صف را مشخص کند. پیامها براساس اولویت در صف مرتب

میشوند. بنابراین پیام بعدی که از صف خوانده میشود، یکی از بالاترین اولویتهاست.

پیام ها دو مد تحویل دارند: ویژه و قابل ترمیم. پیامهای ویژه خیلی سریع تحویل داده میشوند، چون حافظه فقط برای

ذخیره کردن آنها استفاده میشود. پیامهای قابل ترمیم در هر مرحله از مسیریابی در فایلهایی ذخیره میشوند، تا زمانی که

تحویل داده شوند. این روش تحویل قابل اعتماد است، حتی در صورت خرابی شبکه یا راهاندازی مجدد سیستم مشکلساز

نیست.

پیامهای تراکنشی، نسخهی خاصی از پیامهای قابل ترمیم هستند. با استفاده از پیامرسانی تراکنشی تضمین میشود که

پیامها فقط یک بار و به همان ترتیبی که ارسال شدهاند به مقصد میرسند.

-2-2-28 صف پیام

صف پیام یک انبارهی پیام است. پیامهای ذخیره شده روی دیسک را میتوان در فهرست

یافت. برای ارسال پیامها، معمولاً از صفهای عمومی یا خصوصی استفاده \msmq\storage32windir>\system>

میشود، اما انواع دیگری از صفها نیز وجود دارند:

Active منتشر میگردد. اطلاعات راجع به این صفها در میان دامنههای Active Directory • یک صف عمومی در

کپی میگردند. میتوانید از ویژگیهای جستجو و کاوش جهت گرفتن اطلاعاتی درباره این صفها استفاده Directory

کنید. بدون داشتن نام کامپیوتر مربوط به یک صف عمومی، میتوانید به آن دستیابی کنید. همچنین انتقال یک صف از

سیستمی به سیستم دیگر بدون آگاهی سرویسگیرنده نیز امکانپذیر میباشد. ایجاد صفهای عمومی در یک محیط

نیاز است. Active Directory امکانپذیر نیست، چون به WorkGroup

منتشر نمیشوند. این صفها فقط در صورت داشتن نام کامل مسیر صف Active Directory • صفهای خصوصی در

نیز قابل استفاده هستند. WorkGroup قابل دستیابی هستند. صفهای خصوصی در محیط

برای نگهداری کپی پیامها بعد از ارسال یا دریافت آنها استفاده میشوند. با فعال کردن :(journal) •صفهای روزنامه

روزنامه برای یک صف عمومی یا خصوصی، بطور اتوماتیک یک صف روزنامه ایجاد میشود. به وسیله صفهای روزنامه دو نوع

صف مختلف امکانپذیر هستند: روزنامه نگاری مبدأ و روزنامه نگاری مقصد. روزنامهنگار مبدأ بوسیله خصوصیات یک پیام به

جریان میافتد. روزنامهنگاری مقصد بوسیلهی خصوصیات یک صف به جریان میافتد؛ این پیامها در صف روزنامه سیستم

مقصد ذخیره میشوند.

برخلاف برنامهنویسی همگام که خطاها فوراً تشخیص داده میشوند، در صفبندی پیام با روش متفاوتی به خطاها رسیدگی

میشود. اگر یک پیام در مهلت زمانی خاصی به سیستم مقصد نرسد، پیام در صف نامهی غیرقابل توزیع ذخیره میشود.

میتوان صف نامههای غیر قابل توزیع برای بررسی پیامهایی که نرسیدهاند، بررسی کرد.

صفهای مدیریت شامل تصدیقهایی برای پیامهای ارسال شده میباشند. فرستنده میتواند این صف را جهت دریافت

تاییدیه از ارسال موفق پیامها تعیین کند.

اگر به بیش از یک پیام تصدیق ساده به عنوان پاسخی از طرف دریافت کننده نیاز باشد، میتوان از یک صف جواب استفاده

کرد. برنامهی کاربردی دریافت کننده میتواند پیامهای جواب را به فرستندهی اصلی ارسال کند.

یک صف گزارش برای آزمایش پیامها استفاده میشود. صفهای گزارش را میتوان از طریق تغییر نوع یک صف خصوصی یا

ایجاد کرد. {CEq6AFD0020-108CFP11–CCEq- 33F8EE عمومی به شناسهی از پیش تعریف شدهی { 55

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

534

صفهای گزارش میتوانند به عنوان یک ابزار مفید برای پیگیری پیامها روی مسیرهایشان بکار برده شوند.

صفهای سیستم خصوصی هستند و به وسیله سیستم صفبندی پیام بکار برده میشوند .این صفها برای پیامهای

مدیریت، ذخیرهی پیامهای اطلاعرسانی و تضمین ترتیب صحیح پیامهای تراکنشی استفاده میشوند.

-3-2-28 ابزارهای مدیریت صفبندی پیام

قبل از اینکه صفبندی پیام را با برنامهنویسی بررسی کنیم. این بخش ابزار مدیریت آن را جهت ایجاد و مدیریت صفها و

پیامها، که بخشی از سیستمعامل هستند بررسی میکند. ابزارهایی که نشان داده شدهاند، تنها بوسیلهی صفبندی پیام

نصب شده باشد، ویژگیهای صفبندی پیام و این ابزارها در دسترس هستند. MQ استفاده نمیشوند. فقط در صورتیکه

ایجاد صفهای پیام

را با شروع از MMC این WinXP میتوان صفهای پیام را ایجاد کرد. در Computer Management مربوط به MMC در پنجرهی

را اجرا کنید. در compmgmt.msc دستور Run اجرا کنید یا در Administrative Tools و قسمت Control Panel

قرار میگیرد. بعد از انتخاب Services and Application در زیر شاخهی Message Queuing نمایش درختی

5- صفهای جدید را ایجاد کنید(شکل 28 ،Action میتوانید از طریق منوی ،Public Queues یا Private Queues

پیکربندی شده باشد، صفهای عمومی Active Directory در مد Message Queuing را ببنید). فقط در صورتی که

قابل دسترس هستند.

5- شکل 28

خصوصیات صف پیام

خصوصیات صف را تغییر Action میتوانید از طریق منوی Computer Management بعد از ایجاد صف، در کنسول

.(6- دهید(شکل 28

فصل بیست و هشتم ص فبندی پیام

535

6- شکل 28

چندین گزینه را میتوان پیکربندی کرد:

برچسب که نام صف بوده و میتواند برای جستجوی صف به کار برده شود.

نوع شناسه که به طور پیشفرض در {} قرار دارد و برای نگاشت چندین صف به یک دسته یا نوع واحد به کار میرود.

یا (uuid) صفهای گزارش، یک شناسه نوع خاص استفاده میکنند. شناسهی نوع، یک شناسهی منحصر به فرد جهانی

است. GUID

ایجاد کنید. guidgen.exe یا uuidgen.exe توجه: میتوانید شناسههای منحصر به فرد را به کمک نرمافزارهای سودمند

یک ابزار گرافیکی است. guidgen.exe یک ابزار از نوع خط فرمان و uuidgen.exe

2,0 یک محدودیت MQ . • حداکثر اندازهی همهی پیامهای یک صف میتواند محدود شود، تا دیسک به طور کامل پر نشود

3,0 هیچ محدودیتی ندارد. MQ برای ذخیره پیام داشت، ولی GB2

را برای کنترل مجاز بودن کاربران جهت خواندن یا نوشتن پیام علامت بزنید. Authenticated • گزینهی

یا None,Optional میتوانید محتوای پیام را رمزنگاری کنید. مقادیر آن میتوانند privacy level • بوسیله گزینهی

فقط پیامهای رمز شده را میپذیرد و Body . به معنی پذیرش فقط پیامهای رمزنگاری نشده است None . انتخاب شوند Body

هر دو را میپذیرد. Optional مقدار پیشفرض

میتوان روزنامهنگاری مقصد را پیکربندی کرد. بوسیلهی این گزینه، کپی پیامهای دریافت شده در Journal • با تنظیمات

روزنامه ذخیره میشوند. حداکثر اندازه از فضای دیسک تخصیص یافته به پیامهای روزنامهای یک صف را میتوان پیکربندی

کرد. زمانی که اندازه به حداکثر برسد، روزنامهنگاری مقصد متوقف میگردد.

چندپخشی برای صف تعریف میکند. IP دارد که یک آدرس Multicast 3,0 یک گزینهی پیکربندی جدید به نام MQ •

چندپخشی میتواند در چندین گره از شبکه استفاده شود. پس زمانی که یک پیام به یک آدرس ارسال شود، IP این آدرس

توسط چندین صف دریافت میشود.

-3-28 برنامهنویسی صفبندی پیام

اکنون که شما معماری صفبندی پیام را درک کردید، میتوانید به برنامهنویسی آن بپردازید. در بخشهای بعدی نحوهی

ایجاد، کنترل صفها و چگونگی ارسال و دریافت پیامها را میبینید. همچنین یک برنامهی کاربردی کوچک تکلیف درس

میسازید که یک بخش ارسال و دریافت پیام دارد.

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

536

-1-3-28 ایجاد یک صف پیام

از کلاس ()Create را دیدهاید. بوسیله متد Computer Management تا بحال نحوهی ایجاد صفهای پیام بوسیلهی

رد میشود. مسیر شامل نام ()Create میتوانید یک صفت پیام ایجاد کنید. مسیر صف جدید به متد MessageQueue

روی میزبان محلی ایجاد شده است. برای MyNewPublicQueue میزبان مربوط به محل صف و نام صف است. در مثال، صف

private$\MyNewPrivateQueue\ ، در اول مسیر باشد. برای مثال $private ایجاد یک مسیر خصوصی، باید کلمهی

برچسب Label میتوانید خصوصیات صف را تغییر دهید. برای مثال، با استفاده از خصوصیت ()Create بعد از احضار متد

قرار دهید. برنامهی مثال، مسیر صف و نام فرمت را روی کنسول مینویسد. نام فرمت به طور اتوماتیک DemoQueue صف را

جهت دسترسی به صف بدون نام سرور ایجاد میشود. UUID بوسیلهی یک

using System;

using System.Messaging;

namespace Wrox.ProCSharp.Messaging

{

class Program

{

static void Main(string[] args)

{

using (MessageQueue queue = MessageQueue.Create(@".\MyNewPublicQueue"))

{

queue.Label = "Demo Queue";

Console.WriteLine("Queue created:");

Console.WriteLine("Path: {٠}", queue.Path);

Console.WriteLine("FormatName: {٠}", queue.FormatName);

}

}

}

}

CourseOrder -2-3-28 برنامه کاربردی

برای نشان دادن نحوهی کار صفبندی پیام، در این بخش یک راهحل ساده جهت تکلیف درس ایجاد میکنید. این راهحل از

سه اسمبلی تشکیل شده است:

کلاسهای موجودیت برای پیامهای انتقالی را در بر دارد. CourseOrder)) • یک کتابخانه

که پیامها را از صف پیام دریافت میکند. CourseOrderSender)Windows Forms) •یک برنامه کاربردی

CourseOrder کتابخانهی کلاس

هر دو برنامهی ارسال و دریافت پیام، اطلاعات تکلیف را نیاز دارند. به همین دلیل کلاسهای موجودیت در اسمبلی مجزایی

در .Customer ,Course ,CoursOrder : سه کلاس موجودیت دارد CourseOrder قرار داده میشوند. اسمبلی

برنامهی کاربردی نمونه، همهی خصوصیات به صورت دنیای واقعی پیادهسازی نمیشوند، فقط مشخصات کافی جهت رساندن

تعریف شده است. این کلاس فقط یک Course کلاس Course.CS مفهوم این کار پیادهسازی شده است. در فایل

خصوصیت برای عنوان درس دارد:

using System;

namespace Wrox.ProCSharp.Messaging

{

public class Course

{

public Course()

{

}

public Course(string title)

فصل بیست و هشتم ص فبندی پیام

537

{

this.title = title;

}

private string title;

public string Title

{

get

{

return title;

}

set

{

title = value;

}

}

}

}

را در بردارد که شامل اسامی شرکت و شماره تماس میباشد: Custormer کلاس Custromer.cs فایل

using System;

namespace Wrox.ProCSharp.Messaging

{

public class Customer

{

public Customer()

{

}

public Customer(string company, string contact)

{

this.company = company;

this.contact = contact;

}

private string company;

public string Company

{

get

{

return company;

}

set

{

company = value;

}

}

private string contact;

public string Contact

{

get

{

return contact;

}

set

{

contact = value;

}

}

}

}

یک مشتری و یک درس را در یک تکلیف نگاشت میکند: Customer کلاس CourseOrder.cs در فایل

using System;

namespace Wrox.ProCSharp.Messaging

{

public class CourseOrder

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

538

{

public CourseOrder()

{

}

private Customer customer;

public Customer Customer

{

get

{

return customer;

}

set

{

customer = value;

}

}

private Course course;

public Course Course

{

get

{

return course;

}

set

{

course = value;

}

}

}

}

ارسال کنندهی پیام تکلیف درس

است. بوسیلهی این برنامه، تکلیفهای درس CourseOrderSender بخش دوم راهحل، یک برنامه کاربردی ویندوز به نام

ارجاع داده شوند. System.Messaging و CourseOrder به صف پیام ارسال میشوند. باید اسمبلیهای

چندین درس ComboBoxCourses 7 نمایش داده شده است. عناصر کادر بازشوی - واسط کاربردی این برنامه در شکل 28

را در بر دارد. ”ADO.NET“ و ”“Web Services ،Advance .NET Programming” “ همچون

7- شکل 28

احضار میشود. بوسیلهی ()OnSubmitCourseOrder کلیک می شود، متد Submit the Order زمانی که روی دکمه

پر میشود. ComboBox و TextBox ایجاد میشود و خصوصیات آن با محتوای کنترلهای CourseOrder این متد یک شی

برای بازکردن یک صف عمومی با یک نام فرمت ایجاد میشود. نام فرمت برای ارسال MessageQueue سپس یک نمونه از

Computer پیام استفاده میشود، حتی در حالتی که صف قابل دسترس نباشد، میتوانید نام فرمت را با استفاده از کنسول

را جهت سریال کردن آن CourseOrder شی از ()Send و خواندن شناسهی صف پیام بدست آورید. متد Management

و نوشتن آن به صف فراخوانی میکند. XMLMessage بوسیلهی فرمت دهندهی

فصل بیست و هشتم ص فبندی پیام

539

private void OnSubmitCourseOrder(object sender, EventArgs e)

{

CourseOrder order = new CourseOrder();

order.Course = new Course(comboBoxCourses.SelectedItem.ToString());

order.Customer = new Customer(textCompany.Text, textContact.Text);

using (MessageQueue queue = new MessageQueue(

"FormatName:Public=")

{

queue.Send(order, "Course Order {" + order.Customer.Company + "}");

}

MessageBox.Show("Course Order submitted");

}

ارسال پیامهای قابل ترمیم و اولویتدار

میتوان پیامها را اولویتبندی کرد. اگر پیامها به صورت خاص پیکربندی Message کلاس Priority با تنظیم خصوصیت

در همان جایی که بدنهی پیام به سازندهی آن رد میشود، ایجاد گردد. در این مثال، Message شده باشند، باید یک شی

تیک داشته باشد، CheckBoxPriority تنظیم میگردد. در صورتیکه کادر انتخاب Message Priority اولویت در

یک نوع شمارشی است که به MessagePriority . قرار داده میشود MessagePriority.High صفت اولویت پیام

شما این امکان را میدهد تا از پایینترین اولویت ( 0) تا بالاترین اولویت ( 7) به آن مقداردهی کنید. مقدار پیشفرض

مقدار اولویت 3 را دارد. Normal

قرار دهید. true پیام را Recoverable برای قابل ترمیم کردن پیام ،خصوصیت

private void OnSubmitCourseOrder(object sender, EventArgs e)

{

CourseOrder order = new CourseOrder();

order.Course = new Course(comboBoxCourses.SelectedItem.ToString());

order.Customer = new Customer(textCompany.Text, textContact.Text);

using (MessageQueue queue = new MessageQueue(

"FormatName:Public="))

using (System.Messaging.Message message =

new System.Messaging.Message(order))

{

if (checkBoxPriority.Checked)

message.Priority = MessagePriority.High;

message.Recoverable = true;

queue.Send(message, "Course Order {" + order.Customer.Company + "}");

}

MessageBox.Show("Course Order submitted");

}

.(8- با اجرای برنامه میتوانید تکلیفهای درس را به صف پیام اضافه کنید (شکل 28

Mohsen_mahyar@yahoo.com - C# برنامهنویسی

540

8- شکل 28

دریافت کنندهی پیام تکلیف درس

9 نمایش داده شده است. این برنامه پیامها را از صف پیام - نمای طراحی برنامه کاربردی دریافت تکلیف درس در شکل 28

نمایش میدهد. زمانیکه یک تکلیف listOrders میخواند. این برنامه کاربردی برچسب هر تکلیفی را در کادر لیست

انتخاب میشود، محتوای تکلیف بوسیله کنترلهای سمت راست فرم نمایش داده میشوند.

9- شکل 28

ایجاد میشود و این شی به همان صف ایجاد MessageQueue شی CourseOrderRecieveForm در سازندهی کلاس فرم

بوسیلهی انواع پیامها که در خصوصیت XMLMessageFormater . شده در برنامه کاربردی ارسال کننده ارجاع میکند

صف قرار دارند، پیامها را میخواند. Formater

برای نمایش پیامهای موجود در لیست، یک ریسمان جدید ایجاد میشود که به صورت پنهان از دید، پیامها را بررسی

متد اصلی است. اطلاعات بیشتر در مورد ریسمانها را از فصل ریسمانها و همگامسازی PeekMessage میکند. ریسمان

بخوانید.

using System;

using System.ComponentModel;

using System.Drawing;

using System.Windows.Forms;

using System.Threading;

using System.Messaging;

using Wrox.ProCSharp.Messaging;

namespace CourseOrderReceiver

{

public partial class CourseOrderReceiverForm : Form

{

private MessageQueue orderQueue;

public CourseOrderReceiverForm()

{

InitializeComponent();

orderQueue = new MessageQueue(

"FormatName:Public=");

System.Type[] types = new Type[٣];

types[٠] = typeof(CourseOrder);

types[١] = typeof(Customer);

types[٢] = typeof(Course);

orderQueue.Formatter = new XmlMessageFormatter(types);

// start the thread that fills the ListBox with orders

Thread t١ = new Thread(new ThreadStart(PeekMessages));

t١.IsBackground = true;

t١.Start();

}

فصل بیست و هشتم ص فبندی پیام

541

شمارندهی صف پیام را برای نمایش همهی پیامها به کار میبرد. تا زمانی که پیام (PeekMessage متد اصلی ریسمان (یعنی

ادامه پیدا میکند. اگر پیام دیگری در صف نباشد، ریسمان به مدت سه ساعت منتظر while جدیدی در صف باشد، حلقهی

میماند تا قبل از خروج آن متد پیام دیگری برسد.

برای نمایش پیامهای صف در کادر لیست، باید ریسمان مربوط به عمل نوشتن به کادر لیست را به ریسمان ایجاد کننده کادر

به یک ریسمان منفردی محدود میگردند. فقط سازندهی کنترل Windows Form لیست واگذار کند. چون کنترلهای

تقاضا را به ریسمان ایجاد کننده میفرستد. ()Invoke میتواند به خصوصیات و متدهای آن دسترسی داشته باشد و متد

private delegate void MethodInvoker(LabelIdMapping labelIdMapping);

private void PeekMessages()

{

using (MessageEnumerator messageEnum = orderQueue.GetMessageEnumerator٢())

{

while (messageEnum.MoveNext(TimeSpan.FromHours(٣)))

{

Invoke(new MethodInvoker(AddListItem),

new LabelIdMapping(messageEnum.Current.Label,

messageEnum.Current.Id));

}

}

MessageBox.Show("No orders in the last ٣ hours. Exiting thread");

}

private void AddListItem(LabelIdMapping labelIdMapping)

{

listOrders.Items.Add(labelIdMapping);

}

را در بردارد. این کلاس برای نمایش برچسب پیامها در کادر لیست LabelIdMapping عناصری از کلاس ListBox کنترل

استفاده میشود. اما شناسهی پیامها را پنهان نگه میدارد. شناسهی پیام میتواند برای خواندن پیام در زمان دیگری استفاده

شود.

private class LabelIdMapping

{

private string label;

private string id;

public LabelIdMapping(string label, string id)

{

this.label = label;

this.id = id;

}

public override string ToString()

{

return label;

}

public string Id

{

get

{

return id;

}

}

}

OnOrderSelectionChanged اختصاص داده شده به متد SelectedIndexChanged یک رویداد ListBox کنترل

را از انتخاب جاری میگیرد و شناسهی آن را برای بررسی پنهان پیام توسط متد LabelIdMapping دارد. این متد شی

نمایش داده میشود. TextBox بکار میبرد. سپس محتوای پیام در کنترلهای ()peekById

private void OnOrderSelectionChanged(object sender, EventArgs e)

{

LabelIdMapping labelId = (LabelIdMapping)listOrders.SelectedItem;

if (labelId == null)

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

542

return;

System.Messaging.Message message = orderQueue.PeekById(labelId.Id);

CourseOrder order = message.Body as CourseOrder;

if (order != null)

{

textCourse.Text = order.Course.Title;

textCompany.Text = order.Customer.Company;

textContact.Text = order.Customer.Contact;

buttonProcessOrder.Enabled = true;

if (message.Priority > MessagePriority.Normal)

{

labelPriority.Visible = true;

}

else

{

labelPriority.Visible = false;

}

}

else

{

MessageBox.Show("The selected item is not a course order");

}

}

احضار میشود. در اینجا مجددا،ً پیام جاری OnProcessOrder کلیک شود، متد Process Order زمانی که روی دکمهی

پیام از صف حذف میگردد. ()ReceiveById انتخاب شده از کادر لیست ارجاع داده میشود و با فراخوانی متد

private void OnProcessOrder(object sender, EventArgs e)

{

LabelIdMapping labelId = (LabelIdMapping)listOrders.SelectedItem;

System.Messaging.Message message =

orderQueue.ReceiveById(labelId.Id);

listOrders.Items.Remove(labelId);

listOrders.SelectedIndex = -١;

buttonProcessOrder.Enabled = false;

textCompany.Text = "";

textContact.Text = "";

textCourse.Text = "";

MessageBox.Show("Course order processed");

}

}

}

10 اجرای برنامهی کاربردی دریافت کردن پیام را نشان میدهد که سه تکلیف را لیست میکند و در حال جاری - شکل 28

یک تکلیف انتخاب میشود.

10- شکل 28

دریافت کردن نتایج

فصل بیست و هشتم ص فبندی پیام

543

با این نسخه از برنامه کاربردی، برنامهی ارسال کننده هرگز نمیداند که آیا پیام مورد نظر تا بحال توزیع شده است. برای

گرفتن نتایج از گیرنده، میتوان صف های تصدیق یا جواب را به کار برد.

صفهای تصدیق

بوسیلهی یک صف تصدیق، برنامهی ارسال کننده میتواند اطلاعاتی دربارهی حالت پیام بگیرد. بوسیلهی این تصدیقها

میتوانید تعیین کنید آیا دوست دارید یک پاسخ دریافت کنید؟ یعنی اینکه جواب ارسال درست یا اشتباه پیام به فرستنده

برگردانده شود. به عنوان مثال، تصدیقها میتوانند در زمان رسیدن پیامها به صف مقصد یا زمان خوانده شدن پیامها یا

درصورت نرسیدن پیام ارسال شوند.

مقداردهی میشود. این CourseOrderAck با صف Message از نوع کلاس AdministrationQueue در این مثال شئ

صف باید شبیه صف عادی ایجاد شود. این صف به روش دیگری استفاده میشود. فرستندهی اصلی تصدیقها را دریافت

صف را با AcknowledgementType میکند. برای گرفتن یک تصدیق در زمان خوانده شدن یک پیام، خصوصیت

مقداردهی کنید. AcknowledgementType.FullReceive

Message message = new Message(order);

message.AdministrationQueue =

new MessageQueue(@".\CourseOrderAck");

message.AcknowledgementType = AcknowledgementTypes.FullReceive;

queue.Send(message, "Course Order {" +

order.Customer.Company + "}");

string id = message.Id;

برای تعیین هر پیام تصدیق متعلق به پیام ارسال استفاده میشود. هر پیامی که ارسال میشود، یک Correlation id

نگه میدارد. پیامهای Correlation id شناسه دارد و پیام تصدیق مربوط به هر پیامی، شناسهی پیام اصلی را به عنوان

برای دریافت تصدیق ()MessageQueue.ReceiveByCorrelationId صف تصدیق میتوانند به وسیلهی متد

اختصاص داده شده به آنها اقدام کنند. برای پیدا کردن پیامهایی که اصلا به مقصد نرسیدهاند، به جای صف تصدیق از صف

قرار دهید، true را Message از کلاس UseDeadLetterQueue روزنامهی غیرقابل توزیع استفاده کنید. اگر مقدار صفت

در صورتیکه پیام قبل از اتمام مهلت زمانی به آن مقصد نرسد، پیامها به صف روزنامهی غیرقابل توزیع کپی میشوند.

تنظیم کرد. TimeToBeReceived و TimeToReachQueue میتوان مهلتهای زمانی را به وسیلهی خصوصیات

صفهای جواب

اگر اطلاعاتی بیش از تصدیق از کامپیوتر گیرنده نیاز دارید، از یک صف جواب میتوان استفاده کرد. یک صف جواب شبیه

یک صفت عادی است، اما فرستندهی اصلی آن صف را به عنوان یک گیرنده به کار میبرد و گیرندهی اصلی نیز آن صف را به

عنوان یک فرستنده به کار میبرد.

را به صف جواب انتساب دهد. کد نمونهی زیر نشان Message کلاس ResponseQueue فرستنده باید مقدار خصوصیت

پیام CorrelationId میدهد که گیرنده چگونه صف جواب را برای برگرداندن یک پیام جواب به کار میبرد. خصوصیت

جواب با شناسهی پیام اصلی مقداردهی میشود. با این روش سرویسگیرنده تشخیص میدهد که هر جوابی متعلق به کدام

از خصوصیت MessageQueue شی ()Send پیام ارسالی است. این شبیه صفهای تصدیق است. پیام جواب به وسیلهی متد

ارسال میشود. RespenseQueue

public void ReceiveMessage(Message message)

{

Message responseMessage = new Message("response");

responseMessage.CorrelationId = message.Id;

message.ReesponseQueue.Send(responseMessage);

}

اسلام احمد زاده - 09177112161 - C# برنامهنویسی

544

صفهای تراکنشی

بوسیلهی پیامهای قابل ترمیم، رسیدن منظم پیامها و یک بار رسیدن هر پیامی تضمین نمیشود. خطاهای شبکه منجر

میشوند پیامها چندین بار برسند، همچنین اگر فرستنده و گیرنده هر دو چندین پروتکل شبکه داشته باشند و صفبندی

پیام نیز این پروتکلها را به کار برد، این امر اتفاق میافتد. در جاهایی که نیازمند تضمینهای زیر هستیم، میتوان صفهای

تراکنشی را به کار برد:

پیامها به همان ترتیب ارسال، دریافت شوند.

پیامها فقط یک بار برسند.

بوسیلهی صفهای تراکنشی، یک تراکنش واحد، ارسال و دریافت پیامها را در اختیار نمیگیرد و طبیعت صفبندی پیام این

است که زمان مابین ارسال و دریافت پیام میتواند کاملا طولانی باشد. در مقابل آن، تراکنشها باید کوتاه باشند. بوسیلهی

صفبندی پیام، تراکنش اول برای ارسال پیام به صف، تراکنش دوم برای فرستادن پیام روی شبکه و تراکنش سوم برای

دریافت پیامها استفاده میشود.

مثال بعدی نحوهی ایجاد صف پیام تراکنشی و چگونگی ارسال پیامها با استفاده از تراکنش را نشان میدهد.

ایجاد میشود. اگر دوست MessageQueue.Create در پارامتر دوم متد true یک صف پیام تراکنشی با ردکردن مقدار

MessageQueueTransaction دارید توسط یک تراکنش واحد چندین پیام را به صف بنویسید، باید یک نمونه از شی

آن را احضار کنید. زمانی که ارسال همه پیامهای متعلق به یک تراکنش پایان یابد، باید متد ()Begin معرفی کرده و متد

فراخوانی شود. برای لغو کردن یک تراکنش ( هیچ پیامی به صف نوشته MessageQueueTransaction شی ()Commit

انجام میگیرد. Catch فراخوانی شود. این فراخوانی در قسمت ()Abrot نشود)، باید متد

using System;

using System.Messaging;

namespace Wrox.ProCSharp.Messaging

{

class Program

{

static void Main(string[] args)

{

if (!MessageQueue.Exists(@".\MyTransactionalQueue"))

{

MessageQueue.Create(@".\MyTransactionalQueue", true);

}

MessageQueue queue = new MessageQueue(@".\MyTransactionalQueue");

MessageQueueTransaction transaction =

new MessageQueueTransaction();

try

{

transaction.Begin();

queue.Send("a", transaction);

queue.Send("b", transaction);

queue.Send("c", transaction);

transaction.Commit();

}

catch

{

transaction.Abort();

}

}

}

}

فصل بیست و هشتم ص فبندی پیام

545

MessageQueue -4-28 نصب

ایجاد شوند. با این وجود، کاربری که برنامه را اجرا میکند، MessageQueue.Create صفهای پیام میتوانند بوسیله متد

معمولا امتیازهای مدیریتی جهت ایجاد صفهای پیام را ندارد. معمولا صفهای پیام با نصب یک برنامه ایجاد میشوند. برای

میتواند استفاده شود. اگر یک کلاس نصب کننده، بخشی از یک MessageQueueInstaller نصب برنامهها نصب، کلاس

نصب کننده را احضار میکند. ()Install از خط فرمان متد installuti.exe برنامهی کاربردی باشد، برنامهی سودمند

دارد. اگر Windows Form در برنامههای کاربردی MessageQueueInstaller یک پشتیبانی خاصی برای کاربرد VS2005

از کادر ابزار روی فرم گذاشته شود، برچسب هوشمند قطعه به شما اجازه میدهد یک نصب MessageQueue یک قطعهی

را برای تعریف MessageQueueInstaller اضافه کنید. حال میتوانید شی Add Installer کننده از طریق منوی

صفهای تراکنشی، روزنامه، نوع فرمت دهنده، اولویت پایه و غیره را پیکربندی کنید.

-5-28 خلاصه

را دیدید. صفبندی پیام یک تکنولوژی مهم است که نه تنها ارتباط Message Queuing در این فصل چگونگی استفاده از

ناهمگام بلکه ارتباط منفصل را نیز فراهم میکند. فرستنده و گیرنده در زمانهای مختلف میتوانند در حال اجرا باشند، که

این ویژگی بار کاری سرور را روی کل زمان توزیع میکند.

ارسال، دریافت و MessageQueue هستند. کلاس Message و MessageQueue مهمترین کلاسهای صفبندی پیام

برای تعریف محتوای پیام ارسالی است. Message بررسی پنهان پیامها را امکانپذیر میکند و کلاس

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

546

Mohsen_mahyar@yahoo.com - C# برنامه نویسی

 

   + MOHSEN GHASEMI - ۱۱:۳٠ ‎ب.ظ ; ۱۳۸٩/٥/٦