-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathModule.bsl
97 lines (70 loc) · 4.64 KB
/
Module.bsl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Процедура Сервер1(ИмяФайла, КонечныеТочки) Экспорт
Если Не ПодключитьВнешнююКомпоненту(ИмяФайла, "MedIgor", ТипВнешнейКомпоненты.Native,
ТипПодключенияВнешнейКомпоненты.НеИзолированно) Тогда
ВызватьИсключение "Не удалось подключить внешнюю компоненту";
КонецЕсли;
Socket = Новый ("Addin.MedIgor.ZeroMQ.Rep");
Для Каждого КонечнаяТочка Из КонечныеТочки Цикл
Socket.Bind(КонечнаяТочка);
КонецЦикла;
Пока Истина Цикл
ДвоичныеДанные = Socket.Recv();
Если ДвоичныеДанные = Неопределено Тогда
Прервать;
КонецЕсли;
Строка = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные);
Socket.Send(ПолучитьДвоичныеДанныеИзСтроки("Получено: " + Строка));
Если Строка = "Стоп" Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура Publisher1(ИмяФайла, КонечнаяТочка, Сообщение) Экспорт
Если Не ПодключитьВнешнююКомпоненту(ИмяФайла, "MedIgor", ТипВнешнейКомпоненты.Native,
ТипПодключенияВнешнейКомпоненты.НеИзолированно) Тогда
ВызватьИсключение "Не удалось подключить внешнюю компоненту";
КонецЕсли;
Publisher = Новый ("Addin.MedIgor.ZeroMQ.Pub");
Publisher.Connect(КонечнаяТочка);
// Нужно время чтобы подключился Подписчик, иначе сообщение теряется
ПолучитьТекущийСеансИнформационнойБазы().ПолучитьФоновоеЗадание().ОжидатьЗавершенияВыполнения(1);
Publisher.Send(Сообщение);
КонецПроцедуры
Процедура ЗадачаКонвейера(ИмяФайла, ОткудаВзять, КудаОтправить) Экспорт
Если Не ПодключитьВнешнююКомпоненту(ИмяФайла, "MedIgor", ТипВнешнейКомпоненты.Native,
ТипПодключенияВнешнейКомпоненты.НеИзолированно) Тогда
ВызватьИсключение "Не удалось подключить внешнюю компоненту";
КонецЕсли;
Pull = Новый ("Addin.MedIgor.ZeroMQ.Pull");
Pull.Connect(ОткудаВзять);
Pull.SetRecvTimeout(5000);
Push = Новый ("Addin.MedIgor.ZeroMQ.Push");
Push.Bind(КудаОтправить);
Push.SetSendTimeout(5000);
ОбработаноЗадач = 0;
Пока Истина Цикл
Задача = Pull.Recv();
Если Задача = Неопределено Тогда
// Задачи кончились;
Прервать;
КонецЕсли;
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ПолучитьСтрокуИзДвоичныхДанных(Задача));
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
ВыполнитьЗадачу(Данные);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Текст = ЗаписьJSON.Закрыть();
Если Не Push.Send(ПолучитьДвоичныеДанныеИзСтроки(Текст)) Тогда
ВызватьИсключение "Не удалось отправить задачу";
КонецЕсли;
ОбработаноЗадач = ОбработаноЗадач + 1;
КонецЦикла;
ЗаписьЖурналаРегистрации("ЗадачаКонвейера", , , , СтрШаблон("ОбработаноЗадач: %1", ОбработаноЗадач));
КонецПроцедуры
Процедура ВыполнитьЗадачу(Данные)
// Для простоты каждая задача будет заключаться в увеличении числа
Данные.Задача = Данные.Задача + 1;
КонецПроцедуры