Skip to content

Commit

Permalink
переделал работу с таймаутами
Browse files Browse the repository at this point in the history
  • Loading branch information
medigor committed Oct 28, 2024
1 parent 3f4d0a2 commit a1863d4
Show file tree
Hide file tree
Showing 11 changed files with 346 additions and 74 deletions.
23 changes: 14 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,11 @@
Методы:
- `Bind(Endpoint: String)` - привязывает сокет к конечной точке и начинает принимать соединения, вызывается метод [zmq_bind](https://libzmq.readthedocs.io/en/latest/zmq_bind.html).
- `Unbind(Endpoint: String)` - отвязывает ранее привязанную конечную точку. Используется метод [zmq_unbind](https://libzmq.readthedocs.io/en/latest/zmq_unbind.html).
- `SetRecvTimeout(timeout: Число)` - задает таймаут получения сообщения, если метод не вызывался, то таймаут равен 60 сек, см. также [ZMQ_RCVTIMEO](https://libzmq.readthedocs.io/en/latest/zmq_setsockopt.html#_zmq_rcvtimeo_maximum_time_before_a_recv_operation_returns_with_eagain).
- `Send(data: ДвоичныеДанные)` - отправляет ответ клиенту, вызывается метод [zmq_msg_send](https://libzmq.readthedocs.io/en/latest/zmq_msg_send.html).
- `SendPart(data: ДвоичныеДанные)` - отправляет часть составного сообщения, при этом последняя часть должна быть отправлена с помощью метода `Send`.
- `Recv(timeout: Число): ДвоичныеДанные|Неопределено` - получает данные от клиента с ожиданием, таймаут задается в миллисекундах. Если таймаут вышел, то вернется Неопределено. Используется последовательный вызов методов: [zmq_poll](https://libzmq.readthedocs.io/en/latest/zmq_poll.html) и [zmq_msg_recv](https://libzmq.readthedocs.io/en/latest/zmq_msg_recv.html).
- `RecvMultipart(timeout: Число): Число|Неопределено` - получает составное сообщение от клиента, таймаут задается в миллисекундах. Возвращает количество частей, либо Неопределено, если таймаут вышел. Данные части можно получить с помощью метода `GetPart`.
- `Recv(): ДвоичныеДанные|Неопределено` - получает данные от клиента с ожиданием. Если таймаут вышел, то вернется Неопределено. Используется последовательный вызов методов: [zmq_poll](https://libzmq.readthedocs.io/en/latest/zmq_poll.html) и [zmq_msg_recv](https://libzmq.readthedocs.io/en/latest/zmq_msg_recv.html).
- `RecvMultipart(): Число|Неопределено` - получает составное сообщение от клиента. Возвращает количество частей, либо Неопределено, если таймаут вышел. Данные части можно получить с помощью метода `GetPart`.
- `GetPart(НомерЧасти: Число): ДвоичныеДанные` - получает выбранную часть составного сообщения.

### ZeroMQ.Req
Expand All @@ -46,10 +47,11 @@
Методы:
- `Connect(Endpoint: String)` - выполняет подключение к конечной точке, после подключения можно отправлять запросы. Используется метод [zmq_connect](https://libzmq.readthedocs.io/en/latest/zmq_connect.html).
- `Disconnect(Endpoint: String)` - выполняет отключение от конечной точки. Используется метод [zmq_disconnect](https://libzmq.readthedocs.io/en/latest/zmq_disconnect.html).
- `SetRecvTimeout(timeout: Число)` - задает таймаут получения сообщения, если метод не вызывался, то таймаут равен 60 сек, см. также [ZMQ_RCVTIMEO](https://libzmq.readthedocs.io/en/latest/zmq_setsockopt.html#_zmq_rcvtimeo_maximum_time_before_a_recv_operation_returns_with_eagain).
- `Send(data: ДвоичныеДанные)` - отправляет запрос серверу, используется метод [zmq_msg_send](https://libzmq.readthedocs.io/en/latest/zmq_msg_send.html).
- `SendPart(data: ДвоичныеДанные)` - отправляет часть составного сообщения, при этом последняя часть должна быть отправлена с помощью метода `Send`.
- `Recv(timeout: Число): ДвоичныеДанные|Неопределено` - получает ответ от сервера с ожиданием, таймаут задается в миллисекундах. Если таймаут вышел, то вернется Неопределено. Используется последовательный вызов методов: [zmq_poll](https://libzmq.readthedocs.io/en/latest/zmq_poll.html) и [zmq_msg_recv](https://libzmq.readthedocs.io/en/latest/zmq_msg_recv.html).
- `RecvMultipart(timeout: Число): Число|Неопределено` - получает составное сообщение от сервера, таймаут задается в миллисекундах. Возвращает количество частей, либо Неопределено, если таймаут вышел. Данные части можно получить с помощью метода `GetPart`.
- `Recv(): ДвоичныеДанные|Неопределено` - получает ответ от сервера с ожиданием. Если таймаут вышел, то вернется Неопределено. Используется последовательный вызов методов: [zmq_poll](https://libzmq.readthedocs.io/en/latest/zmq_poll.html) и [zmq_msg_recv](https://libzmq.readthedocs.io/en/latest/zmq_msg_recv.html).
- `RecvMultipart(): Число|Неопределено` - получает составное сообщение от сервера. Возвращает количество частей, либо Неопределено, если таймаут вышел. Данные части можно получить с помощью метода `GetPart`.
- `GetPart(НомерЧасти: Число): ДвоичныеДанные` - получает выбранную часть составного сообщения.

### ZeroMQ.Pub
Expand All @@ -73,8 +75,9 @@
- `Connect(Endpoint: String)` - описание см. в объекте `ZeroMQ.Req`.
- `Disconnect(Endpoint: String)` - описание см. в объекте `ZeroMQ.Req`.
- `Subscribe(topic: ДвоичныеДанные)` - подписывается на определенный топик, для подписки на все топики можно передать пустой ДвоичныеДанные, см. также [ZMQ_SUBSCRIBE](https://libzmq.readthedocs.io/en/latest/zmq_setsockopt.html#_zmq_subscribe_establish_message_filter).
- `Recv(timeout: Число): ДвоичныеДанные|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `RecvMultipart(timeout: Число): Число|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `SetRecvTimeout(timeout: Число)` - описание см. в объекте `ZeroMQ.Req`.
- `Recv(): ДвоичныеДанные|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `RecvMultipart(): Число|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `GetPart(НомерЧасти: Число): ДвоичныеДанные` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.


Expand All @@ -86,7 +89,8 @@
- `Unbind(Endpoint: String)` - описание см. в объекте `ZeroMQ.Rep`.
- `Connect(Endpoint: String)` - описание см. в объекте `ZeroMQ.Req`.
- `Disconnect(Endpoint: String)` - описание см. в объекте `ZeroMQ.Req`.
- `Send(data: ДвоичныеДанные)` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `SetSendTimeout(timeout: Число)` - задает таймаут отправки сообщения, если метод не вызывался, то таймаут равен 60 сек, см. также [ZMQ_SNDTIMEO](https://libzmq.readthedocs.io/en/latest/zmq_setsockopt.html#_zmq_sndtimeo_maximum_time_before_a_send_operation_returns_with_eagain).
- `Send(data: ДвоичныеДанные): Булево` - отправляет сообщение в блокирующем режиме, при успешной отправке возвращает `Истина`, если таймаут вышел - `Ложь`, вызывается метод [zmq_msg_send](https://libzmq.readthedocs.io/en/latest/zmq_msg_send.html).
- `SendPart(data: ДвоичныеДанные)` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.


Expand All @@ -98,8 +102,9 @@
- `Unbind(Endpoint: String)` - описание см. в объекте `ZeroMQ.Rep`.
- `Connect(Endpoint: String)` - описание см. в объекте `ZeroMQ.Req`.
- `Disconnect(Endpoint: String)` - описание см. в объекте `ZeroMQ.Req`.
- `Recv(timeout: Число): ДвоичныеДанные|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `RecvMultipart(timeout: Число): Число|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `SetRecvTimeout(timeout: Число)` - описание см. в объекте `ZeroMQ.Req`.
- `Recv(): ДвоичныеДанные|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `RecvMultipart(): Число|Неопределено` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.
- `GetPart(НомерЧасти: Число): ДвоичныеДанные` - описание см. в объектах `ZeroMQ.Rep`/`ZeroMQ.Req`.


Expand Down
62 changes: 60 additions & 2 deletions conf/CommonModules/Задания/Ext/Module.bsl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
КонецЦикла;

Пока Истина Цикл
ДвоичныеДанные = Socket.Recv(60 * 1000);
ДвоичныеДанные = Socket.Recv();
Если ДвоичныеДанные = Неопределено Тогда
Прервать;
КонецЕсли;
Expand All @@ -34,6 +34,64 @@

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;

КонецПроцедуры
20 changes: 20 additions & 0 deletions conf/DataProcessors/Тесты/Forms/Форма/Ext/Form.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@
<CommandName>Form.Command.ТестPushPull</CommandName>
<ExtendedTooltip name="ТестPushPullРасширеннаяПодсказка" id="13"/>
</Button>
<Button name="ТестPipeline" id="14">
<Type>UsualButton</Type>
<CommandName>Form.Command.ТестPipeline</CommandName>
<ExtendedTooltip name="ТестPipelineРасширеннаяПодсказка" id="15"/>
</Button>
<Button name="ТестInfo" id="8">
<Type>UsualButton</Type>
<CommandName>Form.Command.ТестInfo</CommandName>
Expand Down Expand Up @@ -138,5 +143,20 @@
</ToolTip>
<Action>ТестPushPull</Action>
</Command>
<Command name="ТестPipeline" id="6">
<Title>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Тест Pipeline</v8:content>
</v8:item>
</Title>
<ToolTip>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Тест pipeline</v8:content>
</v8:item>
</ToolTip>
<Action>ТестPipeline</Action>
</Command>
</Commands>
</Form>
Loading

0 comments on commit a1863d4

Please sign in to comment.