Использование 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.

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