box.session.push()
Устарело начиная с 3.0.0.
Генерация внеполосного сообщения. Под «внеполосным» подразумевается
дополнительное сообщение, которое дополняет то, что передается по сети
через обычные каналы. Хотя box.session.push() можно вызывать в любой
момент, на практике она используется с сетями, настроенными с помощью
модуля net.box, вызывается сервером (на «удаленной
системе баз данных», если пользоваться терминологией net.box), а у
клиента есть опции для получения таких сообщений.
Эта функция возвращает ошибку, если сессия отключена.
Параметры:
message(any-Lua-type) — отправляемое сообщениеsync(int) — необязательный аргумент для указания сессии, полученный из более раннего вызова box.session.sync(). Если опущен, по умолчанию используется текущее значениеbox.session.sync(). В Tarantool версии 2.4.2 параметрsyncустарел, и его использование вызывает предупреждение. Начиная с версии 2.5.1 его использование вызывает ошибку.
Тип возвращаемого значения
{nil, error} or true:
- Если результатом является ошибка, то первая часть возвращаемого значения —
nil, а вторая — объект ошибки. - Если результат не является ошибкой, возвращается логическое значение
true. - При возврате
trueсообщение попадает в сетевой буфер как пакет с другим кодом заголовка, чтобы клиент мог отличить его от обычного ответа Okay.
Единственная задача сервера — вызвать box.session.push(), механизма
автоматического подтверждения получения сообщения не существует.
Задача клиента — проверять наличие таких сообщений после отправки запроса.
-- Make two shells. On Shell#1 set up a "server", and-- in it have a function that includes box.session.push:box.cfg{listen=3301}box.schema.user.grant('guest','read,write,execute','universe')x = 0fiber = require('fiber')function server_function() x=x+1; fiber.sleep(1); box.session.push(x); end-- On Shell#2 connect to this server as a "client" that-- can handle Lua (such as another Tarantool server operating-- as a client), and initialize a table where we'll get messages:net_box = require('net.box')conn = net_box.connect(3301)messages_from_server = {}-- On Shell#2 remotely call the server function and receive-- a SYNCHRONOUS out-of-band message:conn:call('server_function', {},{is_async = false,on_push = table.insert,on_push_ctx = messages_from_server})messages_from_server-- After a 1-second pause that is caused by the fiber.sleep()-- request inside server_function, the result in the-- messages_from_server table will be: 1. Like this:-- tarantool> messages_from_server-- ----- - - 1-- ...-- Good. That shows that box.session.push(x) worked,-- because we know that x was 1.-- On Shell#2 remotely call the same server function and-- get an ASYNCHRONOUS out-of-band message. For this we cannot-- use on_push and on_push_ctx options, but we can use pairs():future = conn:call('server_function', {}, {is_async = true})messages = {}keys = {}for i, message in future:pairs() dotable.insert(messages, message) table.insert(keys, i) endmessagesfuture:wait_result(1000)for i, message in future:pairs() dotable.insert(messages, message) table.insert(keys, i) endmessages-- There is no pause because conn:call does not wait for-- server_function to finish. The first time that we go through-- the pairs() loop, we see the messages table is empty. Like this:-- tarantool> messages-- ----- - - 2-- --- ...-- That is okay because the server hasn't yet called-- box.session.push(). The second time that we go through-- the pairs() loop, we see the value of x at the time of-- the second call to box.session.push(). Like this:-- tarantool> messages-- ----- - - 2-- - &0-- - 2-- - *0-- ...-- Good. That shows that the message was asynchronous, and-- that box.session.push() did its job.