Enfernuz / quik-lua-rpc

RPC-сервис для вызова API Lua-библиотеки торгового терминала QUIK (ARQA Technologies)
Apache License 2.0
104 stars 43 forks source link

{'error': {'message': "QLua-функция с именем 'OnAllTrade' не найдена.", 'code': 404}} #25

Closed euvgub closed 5 years ago

euvgub commented 5 years ago

socket.send_string('{"method":"OnAllTrade", "args":{"table_name":"alltrade"}}') {'error': {'message': "QLua-функция с именем 'OnAllTrade' не найдена.", 'code': 404}}

Enfernuz commented 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

В конфиге сервиса настройка сокета(-ов) для публикации тоже отдельная, но кроме типа сокета все опции, по сути, одни и те же (адрес, защита соединения, протокол сериализации сообщений).

Если будут проблемы -- пишите, помогу.

euvgub commented 5 years ago

Доступные для PUB/SUB Функции обратного вызова (коллбэки) On* описаны в service.lua local function create_event_callbacks() ?

Enfernuz commented 5 years ago

Можно и так сказать, но перво-наперво они описываются в документации по QLua. Есть, правда, небольшие отличия:

  1. Не публикуется коллбэк OnInit -- он вызывается перед main, и я забил на его передачу. Можно сохранять параметры вызова и публиковать постфактум, после запуска сервиса. Но нужно ли? Относительно связанная задача: https://github.com/Enfernuz/quik-lua-rpc/issues/13
  2. Есть дополнительный коллбэк -- OnDataSourceUpdate. Он публикует обновления по источнику данных, созданных с помощью CreateDataSource и настроенных на обновление различных параметров (O, H, L, C, V, T, Size) с помощью datasource:SetUpdateCallback(...).