2014-10-08 4 views
2

Я пытаюсь выполнить приложение C, который будет следить за пишет/модификации/новые документы события, происходящие на couchbase удаленном кластере, поступающей из различного применения. Теперь я знаком с couchbase C SDK и синхронными экземплярами, но у меня есть проблема с его объединением с libevent для асинхронного ввода-вывода.Мониторинг couchbase ведро с Libevent

Я прочитал couchbase libevent plugin documentation и external event loop integration example, но я не могу понять, как я бы сказал мой event_base, что, например:

Monitor этот файл на этом ведре и отправить мне обратный вызов, когда это модифицированный

Вот что я до сих пор:

Во-первых, я создаю мой Libevent вариант IO

struct event_base *mEvbase = event_base_new(); 
lcb_t instance; 
lcb_error_t err; 

struct lcb_create_io_ops_st ciops; 
lcb_io_opt_t ioops; 

memset(&ciops, 0, sizeof(ciops)); 
ciops.v.v0.type = LCB_IO_OPS_LIBEVENT; 
ciops.v.v0.cookie = mEvbase; 

err = lcb_create_libevent_io_opts(0, &ioops, mEvbase); 
if (err != LCB_SUCCESS) { 
    ERRORMSG0("Failed to create an IOOPS structure for libevent: %s\n", lcb_strerror(NULL, error)); 
} 

, а затем создать свой экземпляр:

struct lcb_create_st create_options; 

std::string host = std::string("couchbase://192.168.130.10/"); 
host.append(bucket); 
const char password[] = "password"; 

create_options.version = 3; 
create_options.v.v3.connstr = host.c_str(); 
create_options.v.v3.passwd = password; 
create_options.v.v3.io = ioops; 

//Creating a lcb instance 
err = lcb_create(&instance, &create_options); 
if (err != LCB_SUCCESS) { 
    die(NULL, "Couldn't create couchbase handler\n", err); 
    return; 
} 

/* Assign the handlers to be called for the operation types */ 
lcb_set_bootstrap_callback(instance, bootstrap_callback); 
lcb_set_get_callback(instance, generic_get_callback); 
lcb_set_store_callback(instance, generic_store_callback); 

, а затем запланировать соединение.

//We now schedule a connection to the server 
err = lcb_connect(instance); 
if (err != LCB_SUCCESS) { 
    die(instance, "Couldn't schedule connection\n", err); 
    lcb_destroy(instance); 
} 
lcb_set_cookie(instance, mEvbase); 

Я использую libcouchbase версию 2.0.17, ядра Libevent версии 2.0.so.5.1.9 и Libevent дополнительных версий 2.0.so.5.1.9. С помощью кода выше мой экземпляр не может подключиться к couchbase. Я получаю следующие предупреждения:

event_pending: event has no event_base set. 
event_add: event has no event_base set. 

So две проблемы здесь: Я не могу подключиться, используя код выше, и я не знаю, в каком направлении двигаться, чтобы начать получать события. Если кто-то укажет мне на ссылку или кодированный пример этого простого случая, который разблокирует меня.

+0

Вы бы запрашивающие уведомления от сервера, когда элемент изменен. К сожалению, в настоящее время это не поддерживается в самом SDK. Однако вы можете взглянуть на TAP или DCP в соответствии с вашими потребностями. Просьба уточнить, не то, что вы хотите. –

+0

Благодарим вас за ответ. Можете ли вы дать мне ссылку на TAP или DCP, потому что я понятия не имею, что это такое, и Google не поможет. – Starscream

+1

TAP и DCP - это внутренние протоколы, используемые узлами для репликации данных между собой. Хотя это внутренние протоколы, вы все равно можете их использовать. В настоящее время Java SDK имеет TAP API. В SDK SD нет интерфейса для TAP в настоящее время. См. Http://www.couchbase.com/autodocs/couchbase-java-client-1.1.4/com/couchbase/client/TapClient.html –

ответ

2

Убедитесь, что вы используете ту же версию libevent для библиотеки и вашего приложения. Устанавливая пакеты из репозитория, вам нужно будет выровняться с используемой в нем версией libevent (например, ldd /usr/lib64/libcouchbase_libevent.so). Имейте в виду, что это должно быть одного и того же ABI (поэтому, например, использование слоя libevent 2.0 -> 1.4 не будет работать, поскольку две версии содержат разные ABI, а использование libcouchbase_libevent.so, связанное с 1.4, будет ломаться под 2.0) ,

Для полного обмена, см замечания по этому вопросу :)

Смежные вопросы