Tarantool CE/EE Documentation portal logo
Помощь
Обновлена 15 сентября 2026 г. в 08:55

box.session.push()

box.session.push(message [, sync])

Устарело начиная с 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() do    table.insert(messages, message) table.insert(keys, i) endmessagesfuture:wait_result(1000)for i, message in future:pairs() do    table.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.