Использование Microsoft Message Queue для обмена информацией с Dynamics NAV (Navision)
Давно собирался опробовать интереснейший механизм Message Queue. Механизм этот используется для обмена информацией между различными приложениями. И вот, испытав его в лабораторных условиях, спешу поделиться результатами.
(Источник: Руководство разработчика по Communication Components)
Однако обо всем по порядку, и начнем с того, что укажем компоненты, которые должны быть установлены до начала работы.
Во-первых, это серверы Automation: Navision Communication Component и Navision MS-Message Queue Bus Adapter. Их можно установить с Product CD (Интерфейсы / 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 / Сообщения очереди».
Но нам не менее важно и получение сообщений.
Пример 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) будем считать завершенным.
Метки: Андрей Панько
9 Октябрь 2008 в 11:07
в пределах локалки все конешно работает, а вот заставить работать этот мехенизм на просторах интерннет не получается, в разных хэлпах по MSMQ пишут про маршрутизацию MQ но как ее организовать примеров нет. Решить эту проблему было б очень хорошо, и реализовать, например, автоматический обмен информацией между региональными представительствами на Nav.
10 Октябрь 2008 в 8:19
Я так понимаю, что этот механизм используется для построения Веб-сервисов. Вроде как ASP на IIS умеет создавать/получать MSMQ.
Но в данном деле не специалист.
Для обмена информацией между региональными представительствами - мне в душу запал Data Director от LS Retail.