我们有一个小代码片段来从 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/