ZMQ,PUB / SUB,删除“睡眠”时丢失消息

时间:2016-05-23 20:51:27

标签: c zeromq publish-subscribe

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

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

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);
}

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

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

1 个答案:

答案 0 :(得分:0)

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

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

你可能想在其他地方创建一个上下文和套接字,只需在回调中调用send。套接字指针可以进入/是用户数据吗?