c - ZMQ、PUB/SUB、删除 "sleep"时丢失消息

标签 c zeromq publish-subscribe

我们有一个小代码片段来从 SQLite 数据库推送消息(作为共享对象文件导入)。 zMQ用于推送一些数据,如行ID、表名等。但是当从代码中删除“ sleep ”时,通信会出现问题。

代码片段具有适合 sqlite 数据库客户端的结构。

void callback (void *user_data,int op,char const *dbn,char const *tn, sqlite3_int64 row_id)
{
    char* optext = "";
    char zmq_string[80];
    int string_length;
    char* connection;
    int linger = 1000;

    void *context = zmq_ctx_new ();
    void *sender =  zmq_socket (context, ZMQ_PUB);

    connection = "tcp://localhost:"  "7676";
    zmq_setsockopt(sender, ZMQ_LINGER, &linger, sizeof (linger));
    zmq_connect (sender, connection);
    string_length = sprintf(zmq_string, "{\"row\":\"%lld\",\"table\":\"%s\"}", (long long)row_id, tn);
    //sleep(1);

    zmq_send (sender, zmq_string, string_length, 0);
    //sleep(1);
    zmq_close (sender);
    zmq_ctx_destroy (context);
}

当我接到 sleep 调用时,一切正常,但没有发送任何内容。 所以我尝试使用 LINGER 命令。但这似乎并没有改变行为。尝试在调用 connect 之前和之后设置 LINGER 参数,但没有成功。

代码的目的是尽可能快地执行并发送消息并返回到数据库客户端。我们没有时间在这个回调中 sleep 。

最佳答案

zmq_send的调用是异步的,它实际上并不发送消息。它被复制到套接字/上下文内的缓冲区中并稍后发送。如果您在调用发送后立即销毁上下文/套接字,那么它可能会在发送之前终止消息。

如果这应该很快,那么您真的不想每次都创建上下文和套接字。创建一个zeromq上下文将创建至少一个线程。

您可能想在其他地方创建上下文和套接字,然后在回调中调用 send。套接字指针可以进入/成为用户数据吗?

关于c - ZMQ、PUB/SUB、删除 "sleep"时丢失消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37400327/

相关文章:

mqtt - MQTT 代理可以配置为以不同的速率向订阅者发送数据吗?

c - 在循环中使用 fgets() 获取输入

c++ - 变量在哪里?他们的值(value)在哪里?

c - 在 char* 数组中存储字符串时出错

windows - 在 Windows 中保留一个 TCP 端口

ipython - Jupyter 和 Common Lisp

php - 在 PHP Web 应用程序中处理多个出站 API 调用

c - 用 O_RDWR 打开——如何覆盖?

wamp - Ratchet WAMP $topic 错误 :Call to a member function broadcast() on a non-object

java - 响应式(Reactive) Redis 主题中发布的消息不会发送到客户端