Введение
Работать с объектом внешней компонентой напрямую не всегда удобно, текущая библиотека OneRabbit является оберткой над внешней компонентой, сглаживающей неприятные углы программного интерфейса самой компоненты. OneRabbit содержит в себе реализацию всех методов, описанных в документации к внешней компоненте PinkRabbitMQ.
Основные фишки:
- Подробные комментарии к каждому методу программного интерфейса, дополняющие документацию самой компоненты
- Обертка всех вызовов компоненты в попытку, с пробросом исключений вверх, автоматически включая данные из метода компоненты GetLastError()
- Чтение сообщений из очереди похоже на работу с Выборкой
- Локализация свойств и методов на русский язык
- При работе с компонентой с тонкого клиента вызов диалога с пользователем при необходимости установки внешней компоненты (реализация #std700 п. 1.1)
- Единый модуль для работы как на клиенте так и на сервере. На клиентский и серверный модуль разнесены лишь процедуры подключения к серверу RabbitMQ для реализации вышестоящего пункта
- Разработчику не нужно лезть в документацию к внешней компоненте, что бы понять какой параметр за что отвечает и что делает тот или иной метод - все описано в комментариях к методам программного интерфейса библиотеки
&НаКлиенте
Процедура РаботаСКомпонентой()
	
	Если Не ПодключитьВнешнююКомпоненту("ОбщийМакет.PinkRabbitMQ", "PinkRabbitMQ", ТипВнешнейКомпоненты.Native) Тогда
		// Упрощенный вариант. Согласно #std700 нужно спрашивать пользователя, 
		// согласен ли он на установку внешней компоненты
		УстановитьВнешнююКомпоненту("ОбщийМакет.PinkRabbitMQ");
		ПодключитьВнешнююКомпоненту("ОбщийМакет.PinkRabbitMQ", "PinkRabbitMQ", ТипВнешнейКомпоненты.Native);
	КонецЕсли;
	
    КлиентRabbitMQ = Новый("AddIn.PinkRabbitMQ.PinkRabbitMQ");
	
	Попытка
    	КлиентRabbitMQ.Connect("127.0.0.1", 5672, "guest", "guest", "/");
	Исключение
		Сообщить(КлиентRabbitMQ.GetLastError());
		Возврат;
	КонецПопытки;
	
	ИдентификаторПотребителя = КлиентRabbitMQ.BasicConsume("queue_name", "", Ложь, Ложь, 100);
	ТелоСообщения = "";
	ИдентификаторСообщения = 0;
	Пока КлиентRabbitMQ.BasicConsumeMessage("", ТелоСообщения, ИдентификаторСообщения, 6000) Цикл
		
		Сообщить(ТелоСообщения);
		Сообщить(ИдентификаторСообщения);
		Сообщить(КлиентRabbitMQ.GetPriority());
		Сообщить(КлиентRabbitMQ.GetRoutingKey());
		Сообщить(КлиентRabbitMQ.GetHeaders());
		
		КлиентRabbitMQ.BasicAck(ИдентификаторСообщения);
		
		ОтветноеСообщение = ""; // Обнуляем, чтобы избежать утечку памяти (по документации компоненты)
		ИдентификаторСообщения = 0; // Обнуляем, чтобы избежать утечку памяти
	КонецЦикла;
	КлиентRabbitMQ.BasicCancel(ИдентификаторПотребителя);
	
КонецПроцедуры
&НаКлиенте
Процедура РаботаСОберткойНадКомпонентой()
	
	ПараметрыПодключения = rabКлиентСервер.ПараметрыПодключения();
	ПараметрыПодключения.Адрес = "127.0.0.1";
	ПараметрыПодключения.Порт = 5672;
	ПараметрыПодключения.ИмяПользователя = "guest";
	ПараметрыПодключения.Пароль = "guest";
	ПараметрыПодключения.ВиртуальныйХост = "/";
	
	Попытка
		// При необходимости установки внешней компоненты - автоматически 
		// задаст вопрос пользователю и вернет Неопределено
		КлиентRabbitMQ = rabКлиент.Подключиться(ПараметрыПодключения);
		Если КлиентRabbitMQ = Неопределено Тогда
			Возврат;
		КонецЕсли;
	Исключение
		Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		Возврат;
	КонецПопытки;
	
	ПараметрыЧтенияСообщений = rabКлиентСервер.ПараметрыЧтенияСообщений();
	ПараметрыЧтенияСообщений.Очередь = "queue_name";
	rabКлиентСервер.НачатьЧтениеСообщений(КлиентRabbitMQ, ПараметрыЧтенияСообщений);
	Пока rabКлиентСервер.СледующееСообщение(КлиентRabbitMQ) Цикл
		
		Сообщить(КлиентRabbitMQ.Сообщение.Тело);
		Сообщить(КлиентRabbitMQ.Сообщение.Идентификатор);
		Сообщить(КлиентRabbitMQ.Сообщение.Приоритет);
		Сообщить(КлиентRabbitMQ.Сообщение.КлючМаршрутизации);
		Сообщить(КлиентRabbitMQ.Сообщение.Заголовки);
		
		rabКлиентСервер.ПодтвердитьПолучение(КлиентRabbitMQ, КлиентRabbitMQ.Сообщение.Идентификатор);
	КонецЦикла;
	rabКлиентСервер.ЗавершитьЧтениеСообщений(КлиентRabbitMQ);
	
КонецПроцедуры
Более подробно о доступных методах библиотеки можно узнать на странице git репозитория github.com/KrasnoshchekovPavel/OneRabbit
Стоит отметить, что PinkRabbitMQ имеет недостатки в виде отсутствия некоторых методов и по объему своего функционала уступает Yellow RabbitMQ. Но надеюсь, что в будущем и OneRabbit и PinkRabbitMQ найдут своих любителей open-source проектов, и получив развитие смогут наравне конкурировать с более крупным, на текущий момент, проектами в данной области.
Технические детали
- Разработано на платформе 8.3.27.1606
- Режим совместимости 8.10
- Поставка в виде cf и cfe файлов (релизы)
- Внедрение в свою конфигурацию (расширение): сравнить-объединить, отметить по подсистеме OneRabbit
Вступайте в нашу телеграмм-группу Инфостарт
