Р?спользование Microsoft Message Queue для обмена информацией СЃ Dynamics NAV (Navision)

Давно собирался опробовать интереснейший механизм Message Queue. Механизм этот используется для обмена информацией между различными приложениями. Р? РІРѕС‚, испытав его РІ лабораторных условиях, спешу поделиться результатами.
Dynamics NAV (Navision) Message Queue
(Р?сточник: Руководство разработчика РїРѕ Communication Components)

Однако обо всем по порядку, и начнем с того, что укажем компоненты, которые должны быть установлены до начала работы.
Р’Рѕ-первых, это серверы Automation: Navision Communication Component Рё Navision MS-Message Queue Bus Adapter. Р?С… можно установить СЃ Product CD (Р?нтерфейсы / Navision SDK / Коммуникационный компонент Рё Адаптеры шин).

Dynamics NAV (Navision) установка SDK

Кстати, адаптеров шин (Bus Adapter) в настоящий момент поставляется два: один для MS Message queue, а второй для Named Pipes. В данной статье мы рассмотрим только первый вариант.

Но вернемся к требованиям. Во-вторых, должен быть установлен Microsoft Message Queue Server (MSMQ) - это компонент Windows.
Чтобы проверить, что РѕРЅ доступен, нужно щелкнуть правой РєРЅРѕРїРєРѕР№ мыши РїРѕ “РњРѕР№ компьютер” Рё выбрать РІ выпадающем меню РїСѓРЅРєС‚ “Управление”(Computer Management). Р’ РіСЂСѓРїРїРµ “Службы Рё приложения” (Services and Applications) должна быть РїРѕРґРіСЂСѓРїРїР° “Очереди сообщений” (Message Queuing).
Если РїРѕРґРіСЂСѓРїРїР° “Очереди сообщений” отсутствует – ничего РЅРµ получится, С‚.Рє. компонент РЅРµ установлен. Р’ этом случае нажимаем «Пуск/ Настройка/ Панель управления/ Установка Рё удаление программ/ Установка компонентов WindowsВ», отмечаем флажком РїСѓРЅРєС‚ «Очереди сообщений», затем РєРЅРѕРїРєР° «Далее».

Считаем, что MSMQ Сѓ нас установлен. Зайдем РІ РіСЂСѓРїРїСѓ “Частные очереди” (Private Queues) Рё создадим РЅРѕРІСѓСЋ очередь (правая РєРЅРѕРїРєР° мыши/ Создать /Частную очередь):
Р?РјСЏ очереди = MyQueue,
Транзактная очередь = Нет.
По информации от разработчиков, тестировалось именно такое сочетание, поэтому как будут работать Публичные/Транзактные очереди они не знают.

Теперь вернемся в Navision.
Теоретически с помощью Message Queue Navision должен обмениваться всякой полезной информацией со сторонними приложениями, однако в наших примерах он будет обмениваться сам с собой.

Пример 1.1. Отправляем простое сообщение.

Переменные
Comcom@Automation.’Navision Communication Component version 2′.CommunicationComponent
ComOut@Automation.’Navision Communication Component version 2′.OutMessage
OutStr@OutStream
MQBus@Automation.’Navision MS-Message Queue Bus Adapter’.MSMQBusAdapter

CREATE(Comcom);

CREATE(MQBus);

MQBus.OpenWriteQueue(’.\private$\MyQueue’,0,0); //точка используется для message queue созданных РЅР° локальном компьютере,
//если нужен другой компьютер – указываем его имя.
Comcom.AddBusAdapter(MQBus,0);

ComOut := Comcom.CreateoutMessage(’Message queue://’);
OutStr := ComOut.GetStream; //получаем поток, в который поместим сообщение

OutStr.WRITE(’nav4u.ru’); //это текст нашего сообщения

ComOut.Send(0); //отправляем

Приведенный выше код можно разместить где угодно: формы, отчеты и т.п.

Отправка сообщений, безусловно, хорошо. Кстати, чтобы убедится, что сообщение отправлено, нужно зайти в «Частные очереди / MyQueue / Сообщения очереди».

Message Queue

Но нам не менее важно и получение сообщений.

Пример 1.2. Получаем простое сообщение.

Переменные
Comcom@Automation.’Navision Communication Component version 2′.CommunicationComponent
ComIn@Automation.’Navision Communication Component version 2′.InMessage
InStr@InStream
MQBus@Automation.’Navision MS-Message Queue Bus Adapter’.MSMQBusAdapter
line@Text 1024

У переменной Comcom нужно активизировать свойство WithEvents = Yes.

Trigger onRun       
 
CREATE(Comcom); 
CREATE(MQBus); 
MQBus.OpenReceiveQueue('.\private$\MyQueue',0,0); 
Comcom.AddBusAdapter(MQBus,1);       
 
Trigger Comcom::MessageReceived(VAR InMessage : Automation "''.IDISPATCH")       
 
ComIn := InMessage; 
InStr := ComIn.GetStream; 
InStr.READTEXT(Line); 
MESSAGE(Line);

Код, кстати рекомендуется размещать в отдельном кодеюните, причем со свойством SingleInstant=Yes. В дальнейшем, этот кодеюнит удобно будет запускать из-под Navision Application Server.

Р?так, РјС‹ научились передавать Рё получать простенькие сообщения. Надеюсь, никто РЅРµ воспринимал возможность отправить строку ‘nav4u.ru’ как серьезное достижение?

Теперь попробуем отправить, а затем получить XML-файл.

Пример 2.1. Отправляем XML-файл.

Переменные
Comcom@Automation.’Navision Communication Component version 2′.CommunicationComponent
ComOut@Automation.’Navision Communication Component version 2′.OutMessage
OutStr@OutStream
MQBus@Automation.’Navision MS-Message Queue Bus Adapter’.MSMQBusAdapter
XMLDom@Automation.’Microsoft XML, v6.0′.DOMDocument

CREATE(Comcom); 
CREATE(MQBus);       
 
MQBus.OpenWriteQueue('.\private$\MyQueue',0,0); 
Comcom.AddBusAdapter(MQBus,0);       
 
ComOut := Comcom.CreateoutMessage('Message queue://'); 
OutStr := ComOut.GetStream;       
 
CREATE(XMLDom); 
XMLDom.load('C:\from.xml');  //открыли xml-файл 
XMLDom.save(OutStr);  //отправили его в поток       
 
ComOut.Send(0);

Пример 2.2. Получаем XML-файл

Переменные
Comcom@Automation.’Navision Communication Component version 2′.CommunicationComponent
MQBus@Automation.’Navision MS-Message Queue Bus Adapter’.MSMQBusAdapter
ComIn@Automation.’Navision Communication Component version 2′.InMessage
InStr@InStream
XMLDom@Automation.’Microsoft XML, v6.0′.DOMDocument

Trigger onRun       
 
CREATE(Comcom); 
CREATE(MQBus); 
CREATE(XMLDom); 
MQBus.OpenReceiveQueue('.\private$\MuQueue',0,0); 
Comcom.AddBusAdapter(MQBus,1);       
 
Trigger Comcom::MessageReceived(VAR InMessage : Automation "''.IDISPATCH") 
ComIn := InMessage; 
InStr := ComIn.GetStream; 
XMLDom.load(InStr); 
XMLDom.save('c:\to.xml');

Думаю, понятно, что в OutStream можно поместить результат работы XML-порта, а InStream использовать в качестве источника.
Например, если вместо

CREATE(XMLDom); 
XMLDom.load('C:\from.xml'); 
XMLDom.save(OutStr);

Р?спользовать РєРѕРґ XMLPORT.EXPORT(8002,OutStr); то через Message Queue будет отправлена карточка товара 1000.

Также следует отметить, что мы реализовали асинхронный режим обмена данными, кроме того с Message Queue можно организовать синхронный режим. Пример, реализации синхронного режима можно посмотреть в on-line справке, которую можно запускать, в том числе и из C\AL Symbol Menu.

На этом разбор технологии Microsoft Message Queue и ее взаимодействие с Microsoft Dynamics NAV (он же Navision) будем считать завершенным.

Метки:



Комментариев: 2

  1. Raul пишет:

    в пределах локалки все конешно работает, а вот заставить работать этот мехенизм на просторах интерннет не получается, в разных хэлпах по MSMQ пишут про маршрутизацию MQ но как ее организовать примеров нет. Решить эту проблему было б очень хорошо, и реализовать, например, автоматический обмен информацией между региональными представительствами на Nav.

  2. apanko пишет:

    Я так понимаю, что этот механизм используется для построения Веб-сервисов. Вроде как ASP на IIS умеет создавать/получать MSMQ.
    Но в данном деле не специалист.

    Для обмена информацией между региональными представительствами - мне в душу запал Data Director от LS Retail.

Оставьте свой отзыв!