Опубликован: 23.05.2008 | Доступ: свободный | Студентов: 1570 / 396 | Оценка: 4.80 / 4.10 | Длительность: 15:29:00
Специальности: Программист
Самостоятельная работа 3:

Разработка и реализация централизованного алгоритма балансировки для ВС с произвольной топологией. Реализация волнового алгоритма Финна

Создание очередей

За создание новой очереди отвечает статический метод Create класса MessageQueue. В большинстве случаев очереди создаются системным администратором через консоль управления компьютером, однако иногда приложению требуется создать новые очереди на ходу. Метод Create является перегруженным, его параметр строкового типа указывает путь очереди, а параметр логического типа указывает, что очередь должна быть транзакционной. Для создания новой очереди используется фрагмент кода:

MessageQueue.Create(".\\Private$\\TestQ");

Символ "." используется как ссылки на локальную машину, если требуется, его можно заменить именем другого компьютера. Ключевое слово "Private$" означает, что создаваемая очередь является локальной, то есть другие машины сети не имеют доступа к ней. Для создания общедоступной очереди метод Create необходимо указать путь в формате "MachineName\QueueNaitie".

Для создания общедоступных очередей компьютер должен быть доменным сервером. Поэтому в данной лабораторной работе следует применять только локальные очереди.

Чтобы проверить, что очередь была создана корректно, на вкладке "Server Explorer" найдите очередь TestQ.

Доступ к очередям

После создания очереди необходим способ обращения к ней из исходного кода. Для этого предназначены несколько методов перечисления доступных очередей. Соответствующие статические методы класса MessageQueue приведены в таблице ниже.

Метод Описание
GetPrivateQueuesByMachine Возвращает локальные очереди на компьютере
GetPublicQueues Возвращает общедоступные очереди в сети
GetPublicQueuesByCategory Возвращает общедоступные очереди в сети, принадлежащие заданной категории
GetPublicQueuesByLabel Возвращает общедоступные очереди в сети, совпадающие с заданной меткой
GetPublicQueuesByMachine Возвращает общедоступные очереди для заданного компьютера

Представленный ниже программный код демонстрирует перечисление доступных локальных очередей.

// Получаем список локальных очередей данного компьютера
MessageQueue[] QueueList =
    MessageQueue.GetPrivateQueuesByMachine(".");

// В диалоговом окне выводим пути доступных очередей
foreach (MessageQueue queueItem in QueueList)
{
    MessageBox.Show(queueItem.Path);
}
Удаление очередей

Для удаления очередей используется статический метод Delete. Параметром метода является полное имя общедоступной или локальной очереди. В следующем примере удаляются локальная очередь с именем TestQ.

MessageQueue.Delete(".\\Private$\\TestQ");
Посылка сообщения

Для посылки сообщения очереди применяется метод Send, который является перегруженным и включает параметры Body, Label и Transaction. Ниже приведен пример кода, где выполняются отправка сообщения.

MessageQueue q = new MessageQueue(".\\Private$\\TestQ");
if (MessageQueue.Exists(q.Path))
{
    q.Send("Test message","msg1");
    q.Close();
}

Для проверки того, что очередь существует, применяется метод Exists. Желательно всегда производить подобную проверку, чтобы при выполнении программы не генерировалось прерывание, вызванное тем, что очередь не создана или находится в другом месте.

Если просмотреть очереди в консоли управления компьютером, в очереди TestQ можно найти сообщение сметкой msg1. При двойном щелчке на сообщении или выборе команды "Свойства" в контекстном меню по правой кнопке мыши можно просмотреть свойства и текст сообщения.

Чтение сообщений очереди

Для чтения сообщения из очереди используется метод Peek или Receive. Метод Peek читает первое сообщение в очереди. Он используется для проверки наличия сообщений в очереди и проверки ее свойств. При этом сообщение не удаляется. Если вызвать метод несколько раз, он будет возвращать одно и то же сообщение, пока в очереди не появится сообщение более высокого приоритета. Метод Receive читает сообщение и удаляет его из очереди.

Применение метода Peek демонстрируется в следующем фрагменте кода.

// Подключение к очереди
	MessageQueue q = new MessageQueue(".\\Private$\\TestQ");

	// Установка форматера тела сообщения.
	q.Formatter = new XmlMessageFormatter(new Type[]
		{typeof(System.String)});
	
	try
	{
		// Просмотр и форматирование сообщения. 
		System.Messaging.Message myMessage =	q.Peek(); 
		String str = (String)myMessage.Body;

		// Вывод тела сообщения на экран.
		MessageBox.Show(str);
	}
	catch (MessageQueueException)
	{
		// Обработка исключений, связанных с очередями.
	}
	// Обработка исключений, связанных с сериализацией.
	catch (InvalidOperationException ex)
	{
		Console.WriteLine(ex.Message);
	}

Применение метода Receive демонстрируется в следующем фрагменте кода.

MessageQueue q = new MessageQueue(".\\Private$\\TestQ");
q.Formatter = new XmlMessageFormatter(new Type[] { typeof(System.String) });
try
{
    System.Messaging.Message myMessage = q.Receive();
    String str = (String)myMessage.Body;
    MessageBox.Show(str);
}
catch (MessageQueueException)
{
}
catch (InvalidOperationException ex)
{
    Console.WriteLine(ex.Message);
}
Удаление сообщений из очереди

Для удаления сообщений используется метод Purge объекта MessageQueue. Следующий фрагмент кода удаляет все сообщения из очереди TestQ.

MessageQueue q = new MessageQueue(".\\Private$\\TestQ");
q.Purge();

В реальной очереди вам, скорее всего, не придется удалять сообщения. Метод Purge применяется, в основном, для журнальных очередей. Если свойство UseJournalQueue установлено при создании очереди значением True, каждое сообщение дублируется в журнальной очереди. Для удаления журнальной копии очереди TestQ применяется следующий фрагмент кода:

MessageQueue q = new MessageQueue(".\\Private$\\TestQ\\Journal$");
q.Purge();

Рекомендуемые программные средства и литература

Для выполнения данной лабораторной работы следует использовать языки C# или Visual Basic .NET.

Рекомендуемая литература по созданию многопоточных приложений на VB .NET:

  1. Петрусос Е. Эффективная работа: Visual Basic .NET.-СПб.: Питер, 2002. 928 с.
  2. Корнелл Г., Моррисон Дж. Программирование на VB. NET: учебный курс. СПб.: Питер, 2002. 400 с.
  3. Эппламан Д. Переход на VB .NET: стратегии, концепции, код. CПб.: Питер, 2002. 464 c.

Рекомендуемая литература по созданию многопоточных приложений на C#:

  1. Троелсен Э. С# и платформа .NET. СПб.: Питер, 2003. 800 с.
  2. Секунов Н.Ю. Разработка приложений на С++ и С#. СПб.: Питер, 2003. 608 с.
  3. Шилдт Г. С#. СПб.: Питер, 2003. 512 с.

Отчетность:

В результате выполнения лабораторной работы должны бать представлены следующие материалы:

  1. Программа;
  2. Исходные тексты;
  3. Презентация работы;
  4. Презентация, в которой освещаются вопросы реализации алгоритма балансировки
Дмитрий Полянский
Дмитрий Полянский
Ольга Космодемьянская
Ольга Космодемьянская

Я прошла курс "Распределенные системы и алгоритмы". Сдала экзамен экстерном и получила диплом. Вопрос: можно ли после завершения теста посмотреть все вопросы, которые были на экзамене и все варианты ответов? Мне это необходимо для отчета преподавателю в моем ВУЗе. Заранее спасибо!