SQLiteデータベースからメッセージをプッシュする小さなコードスニペットがあります(共有オブジェクトファイルとしてインポート)。 zMQは行ID、テーブル名などのデータをプッシュするために使用されますが、コードから「スリープ」が削除されたときに通信に問題があります。"sleep"が削除されたときにZMQ、PUB/SUBのメッセージが失われる
コードスニペットは、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);
}
スリープコールがあると、すべて正常に動作しますが、何もせずに送信されます。 LINGERコマンドを使用しようとしました。しかし、それは行動を変えないようです。成功することなくconnectの呼び出しの前後にLINGERパラメータを設定しようとしました。
コードの目的は、できるだけ早くメッセージを実行して送信し、データベースクライアントに返すことです。このコールバックでは眠る時間がありません。
sleep()などは、接続/切断プロトコルの重量を乗り越えているときには本当に重要ですか?とにかくあなたのパフォーマンスは絶望的に悪くなるでしょう。 –
そうかもしれないが、これは私が現在持っているものであり、私はこの時点で何も変更できない。私たちは組み込みデバイスのために十分な性能を持っていましたが、複数のパブリッシャのためにpub/subに接続する必要があります。 – Easyrider
zmq関数呼び出しからの戻り値をログに記録しようとしましたか? – user3188346