Лабораторная работа 7 (ПКРПСиБД LAB7 Бочаров И.А.)

Посмотреть архив целиком

Национальный исследовательский институт

Московский Энергетический Институт (Технический Университет)

Институт автоматики и вычислительной техники

Кафедра Прикладной математики





Лабораторная работа №7

по дисциплине:

Проектирование крупных распределенных программных систем и баз данных

тема: «Разработка приложения с событийно-управляемой архитектурой с применением NServiceBus»

Выполнил:

Бочаров Иван Андреевич

Проверил:

к.т.н., доц. Куриленко Иван Евгеньевич









Москва

2012 г.

NServiceBus

NServiceBus является популярным фреймворком для интеграции сервисов и разработки распределенных приложений.

Автор – архитектор и исследователь Udi Dahan.

В качестве основного транспорта используется MSMQ (Microsoft Message Queue), который обеспечивает транзакционность, надежную пересылку и дисковое хранение сообщений.

Шина NServiceBus является виртуальной сущностью, полученной в результате взаимодействия сервисов вместе. Это означает, что в каждом процессе присутствует своя сущность шина, обеспечивающая отправку и получение сообщений.

Рис. 1 Схематическое изображение шины

Шаблоны обмена сообщениями

  • Однонаправленное сообщение (One-way)

  • Запрос/ответ (RPC)

  • Дуплексный обмен (Full-duplex)

  • Издатель/подписчик (Pub/Sub)





Исходный код

Message.cs

using System;


namespace MyMessages

{

[Serializable]

public class EventMessage : IMyEvent

{

public Guid EventId { get; set; }

public DateTime? Time { get; set; }

public string Text { get; set; }

}


public interface IMyEvent

{

Guid EventId { get; set; }

DateTime? Time { get; set; }

string Text { get; set; }

}

}


Subscriber1.cs

using System;

using log4net;

using MyMessages;

using NServiceBus;


namespace Subscriber1

{

public class EventMessageHandler : IHandleMessages<EventMessage>

{

public void Handle(EventMessage message)

{

Console.WriteLine(string.Format("Получено сообщение с идентификатором {0}.", message.EventId));

Console.WriteLine(string.Format("Тело сообщения: {0}.", message.Text));

Console.WriteLine(string.Format("Время сообщения: {0}.", message.Time));


Console.WriteLine("==========================================================================");

}

}

}

MyPublisher.cs

using System;

using MyMessages;

using NServiceBus;


namespace MyPublisher

{

public class ServerEndpoint : IWantToRunAtStartup

{

public IBus Bus { get; set; }


public void Run()

{

Console.WriteLine("Для выхода введите EXIT");

string key;

while ((key=Console.ReadLine()) != "EXIT")

{

var eventMessage = new EventMessage();


eventMessage.EventId = Guid.NewGuid();

eventMessage.Time = DateTime.Now;

eventMessage.Text = key;


Bus.Publish(eventMessage);


Console.WriteLine("Опубликовано сообщение с идентификатором {0}.", eventMessage.EventId);

Console.WriteLine("==========================================================================");

}

}


public void Stop()

{

Console.WriteLine("Рассылка сообщений прекращена");


}

}

}


App.config для подписчиков

xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />

<section name="Logging" type="NServiceBus.Config.Logging, NServiceBus.Core" />

<section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />

configSections>


<Logging Threshold="OFF" />

<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>

<UnicastBusConfig>

<MessageEndpointMappings>

<add Messages="MyMessages" Endpoint="MyPublisher" />

MessageEndpointMappings>

UnicastBusConfig>


configuration>


App.config для публикатора

xml version="1.0" encoding="utf-8" ?>

<configuration>

<configSections>

<section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />

configSections>

<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>


<runtime>

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">

<dependentAssembly>

<assemblyIdentity name="Common.Logging"

publicKeyToken="af08829b84f0328e"

culture="neutral" />

<bindingRedirect oldVersion="1.2.0.0"

newVersion="2.0.0.0"/>

dependentAssembly>

assemblyBinding>

runtime>

configuration>

EndpointConfig.cs

using NServiceBus;


namespace Subscriber1

{

class EndpointConfig : IConfigureThisEndpoint, AsA_Server,IWantCustomInitialization

{

public void Init()

{

Configure.With()

.DefiningEventsAs(t => t.Namespace != null && t.Namespace.StartsWith("MyMessages"));}

}

}


Разработанное приложение






Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.