我们有一个小代码片段来推送来自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参数,但没有成功。
代码的目的是尽可能快地执行和发送消息并返回数据库客户端。我们没有时间在这个回调中睡觉。
答案 0 :(得分:0)
对zmq_send
的调用是异步的,它实际上并不发送消息。它被复制到套接字/上下文中的缓冲区中,稍后发送。如果你在调用send之后立即销毁了上下文/套接字,那么它可能会在发送之前终止该消息。
如果这应该很快,那么你真的不想每次都创建一个上下文和套接字。创建一个zeromq上下文将创建至少一个线程。
你可能想在其他地方创建一个上下文和套接字,只需在回调中调用send。套接字指针可以进入/是用户数据吗?