Closed euvgub closed 5 years ago
Функции обратного вызова (коллбэки) On*
идут через сокеты типа publisher-subscriber (т.е., на стороне клиента это ZMQ.SUB
, а на стороне сервиса -- ZMQ.PUB
), а не обычную пару request-response сокетов (ZMQ.REQ
/ZMQ.REP
).
Подписка на псевдокоде происходит так:
sub_socket = zmq.socket(zmq.sub); // тип сокета: ZMQ_SUBSCRIBE
sub_socket.subscribe("OnAllTrade"); // если на все коллбэки, то sub_socket.subscribe(""). Если использовать protobuf, то вместо названия коллбэка передаётся строка с номером коллбэка в файле qlua_events.proto.
sub_socket.connect("tcp://127.0.0.1:5565");
while (running) {
subscription_key = sub_socket.recv(); // subscription_key -- это строка с названием коллбэка; NB: вызов блокирующий
print(subscription_key);
if (sub_socket.has_receive_more() ) {
print( sub_socket.recv_msg() );
}
}
sub_socket.disconnect();
sub_socket.close();
Вот небольшой гайд по паттерну PUB/SUB для Python: https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pubsub.html
В конфиге сервиса настройка сокета(-ов) для публикации тоже отдельная, но кроме типа сокета все опции, по сути, одни и те же (адрес, защита соединения, протокол сериализации сообщений).
Если будут проблемы -- пишите, помогу.
Доступные для PUB/SUB Функции обратного вызова (коллбэки) On* описаны в service.lua local function create_event_callbacks() ?
Можно и так сказать, но перво-наперво они описываются в документации по QLua. Есть, правда, небольшие отличия:
OnInit
-- он вызывается перед main, и я забил на его передачу. Можно сохранять параметры вызова и публиковать постфактум, после запуска сервиса. Но нужно ли? Относительно связанная задача: https://github.com/Enfernuz/quik-lua-rpc/issues/13OnDataSourceUpdate
. Он публикует обновления по источнику данных, созданных с помощью CreateDataSource
и настроенных на обновление различных параметров (O, H, L, C, V, T, Size) с помощью datasource:SetUpdateCallback(...)
.
socket.send_string('{"method":"OnAllTrade", "args":{"table_name":"alltrade"}}') {'error': {'message': "QLua-функция с именем 'OnAllTrade' не найдена.", 'code': 404}}