При обмене данными между разными информационными системами мы сталкиваемся с определенными трудностями:
- Как отправить сообщение из одной информационной системы нескольким, не зная об их количестве.
- Как нам отправлять сообщения, не дожидаясь ответа.
- Как отправить одно и то же сообщение информационным системам, требующим на вход разные типы сообщений (xml, json и т.д.).
Паттерн Publisher/Subscriber, также известный как Observer, позволяет сделать возможным такое взаимодействие, добавляя прослойку между отправителем и получателем в виде сервера. Благодаря серверу мы можем подняться на один уровень абстракций выше обмена и добавить сущность для промежуточного хранения файлов, а также сущность для преобразования файлов.
Реализуем данный паттерн текстом.
Без шины (принцип вытягивания).
Жил-был магазин животных, в него приходили покупатели и покупали домашних животных. Но в один момент магазин стал слишком большим для просто закупок, и они стали продавать животных через биржу магазинам поменьше. Но они столкнулись с проблемой, некоторые магазины брали только кошек, некоторые только собак, некоторые только собак комнатного размера.
С простейшей шиной (толкай - тяни)
Тогда магазин (pub) нанял мужичка (server), которому они отдавали животных по мере появления. Мужичок бережливо распределял их по разным комнатам, кошек в одну, собак в другую. А магазины (sub) поменьше стали приходить только в нужные им комнаты и брать живность. Но покупателей становилось всё больше, и сами они становились всё специфичнее. Одни требовали сделать прическу собакам, другие научить их командам, а третьи расстраивались, когда, придя в комнату, не находили там животных, из-за того, что их уже кто-то забрал.
С полноценной шиной.
Тогда хитрый мужичок построил аппарат для клонирования, и каждому приходящему в комнату отдавал нужное животное (message), но с необходимым набором навыков (xml, json, char[]… whatever).
Домашнее задание.
- Реализовать вариант «с простейшей шиной» на языке 1С. 1 pub, 2 subа. В качестве хранилища использовать каталоги системы. Обмен в формате xml, через стандартную сериализацию. Порядок обмена следующий:
1.1 Pub кладет в каталог pub файлик со строкой.
1.2 Шина его забирает.
1.3 Преобразует файл ( input: MessageNumber.xml, output: base1_ MessageNumber.xml, base2_ MessageNumber.xml).
1.4 Кладет полученные файлы в каталог sub.
1.5 Удаляет файл из каталога pub.
1.6 Откуда их забирают (слушая наличие файлов) subы, записывают значения в справочник. И удаляют файлик.
2. Усложним задачу: одна из баз будет принимать xml, а вторая json. Сведения о том, какая база какой тип принимает, должны храниться в шине в виде справочника.
Как проверяется задание:
В Publishere пишем строку, нажимаем “Разослать», проверяем наличие записи в базах-приемниках.