Я начинаю работать с Couchbase Mobile. Особенность, которая меня больше всего интересует (на данный момент) - репликация PULL
(хранение данных на мобильном устройстве в синхронизации c с базой данных бэкенда)
Я выполнил шаги, описанные в Используя Docker для разработки с Couchbase Mobile и получил сервер Couchbase (enterprise-6.5.0) и шлюз syn c (2.7.0 Предприятие) развернуто локально. Я добавил базу данных beer-sample
(содержит ~ 8400 документов) и сейчас пытаюсь скопировать ее в приложение android. Я настроил проект Userprofile Couchbase Mobile Android и указал его на свой локальный шлюз syn c. У меня есть кусок кода для репликации, как показано ниже:
public static void startPullReplication() {
Log.i("Pull", "Start pull beer-sample");
URI url = null;
try {
url = new URI(String.format("%s/%s", "ws://10.0.1.7:4984", beerSampleDbName));
} catch (URISyntaxException e) {
e.printStackTrace();
}
ReplicatorConfiguration config =
new ReplicatorConfiguration(beerSampleDatabase, new URLEndpoint(url)); // <1>
config.setReplicatorType(ReplicatorConfiguration.ReplicatorType.PULL); // <2>
config.setContinuous(true); // <3>
config.setAuthenticator(new BasicAuthenticator("admin", "password")); // <4>
// config.setChannels(Arrays.asList("channel." + "admin")); // <5>
replicator = new Replicator(config);
replicatorListenerToken =
replicator.addChangeListener(
new ReplicatorChangeListener() {
@Override
public void changed(ReplicatorChange change) {
Log.i("Pull", "Changed pull beer sample : " + change.getStatus());
if (change
.getReplicator()
.getStatus()
.getActivityLevel()
.equals(Replicator.ActivityLevel.IDLE)) {
Log.i("Replication Comp Log", "Scheduler Completed");
}
if (change
.getReplicator()
.getStatus()
.getActivityLevel()
.equals(Replicator.ActivityLevel.STOPPED)
|| change
.getReplicator()
.getStatus()
.getActivityLevel()
.equals(Replicator.ActivityLevel.OFFLINE)) {
Log.i("Rep Scheduler Log", "ReplicationTag Stopped");
}
}
});
replicator.start();
Log.i("Pull", "Replication beer-sample started");
}
и слушаю изменения в БД, как показано ниже:
private void registerForDatabaseChanges() {
beerSampleListenerToken =
beerSampleDatabase.addChangeListener(
new DatabaseChangeListener() {
Integer i=0;
@Override
public void changed(@NonNull DatabaseChange change) {
Log.i("DatabaseChangeEvent", String.valueOf(i));
i++;
for (String docId : change.getDocumentIDs()) {
Document doc = beerSampleDatabase.getDocument(docId);
if (doc != null) {
Log.i("DatabaseChangeEvent", doc.getId() + ": Document was added/updated");
} else {
Log.i("DatabaseChangeEvent", docId + "Document was deleted");
}
}
}
});
}
Теперь, когда я запускаю приложение, я получаю следующее logs.
2020-02-11 15:44:46.420 22513-22513/com.cbmob.testapp W/CouchbaseLite/DATABASE: Database.log.getFile().getConfig() is null, meaning file logging is disabled. Log files required for product support are not being generated.
2020-02-11 15:44:46.615 22513-22545/com.cbmob.testapp D/OpenGLRenderer: HWUI GL Pipeline
2020-02-11 15:44:46.744 22513-22545/com.cbmob.testapp I/zygote: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
2020-02-11 15:44:46.744 22513-22545/com.cbmob.testapp I/OpenGLRenderer: Initialized EGL, version 1.4
2020-02-11 15:44:46.744 22513-22545/com.cbmob.testapp D/OpenGLRenderer: Swap behavior 1
2020-02-11 15:44:46.745 22513-22545/com.cbmob.testapp W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
2020-02-11 15:44:46.745 22513-22545/com.cbmob.testapp D/OpenGLRenderer: Swap behavior 0
2020-02-11 15:44:46.752 22513-22545/com.cbmob.testapp D/EGL_emulation: eglCreateContext: 0xa9f30d40: maj 3 min 0 rcv 3
2020-02-11 15:44:46.765 22513-22545/com.cbmob.testapp D/EGL_emulation: eglMakeCurrent: 0xa9f30d40: ver 3 0 (tinfo 0x9f7bf880)
2020-02-11 15:44:46.976 22513-22545/com.cbmob.testapp D/EGL_emulation: eglMakeCurrent: 0xa9f30d40: ver 3 0 (tinfo 0x9f7bf880)
2020-02-11 15:44:56.458 22513-22513/com.cbmob.testapp I/Pull: Start pull beer-sample
2020-02-11 15:44:56.480 22513-22576/com.cbmob.testapp W/CouchbaseLite/NETWORK: C4Socket.open() socket -> 2852069288
2020-02-11 15:44:56.480 22513-22576/com.cbmob.testapp W/CouchbaseLite/NETWORK: C4Socket.open() clazz -> com.couchbase.lite.internal.replicator.CBLWebSocket
2020-02-11 15:44:56.482 22513-22513/com.cbmob.testapp I/Pull: Replication beer-sample started
2020-02-11 15:44:56.497 22513-22513/com.cbmob.testapp I/Pull: Changed pull beer sample : Status{activityLevel=CONNECTING, progress=Progress{completed=0, total=0}, error=null}
2020-02-11 15:44:56.519 22513-22576/com.cbmob.testapp D/NetworkSecurityConfig: No Network Security Config specified, using platform default
2020-02-11 15:44:56.528 22513-22576/com.cbmob.testapp E/CouchbaseLite/NETWORK: CBLWebSocket.socket_open()
2020-02-11 15:44:56.582 22513-22576/com.cbmob.testapp W/CouchbaseLite/NETWORK: C4Socket.write() handle -> 2852069288
2020-02-11 15:44:56.586 22513-22576/com.cbmob.testapp W/CouchbaseLite/NETWORK: completedWrite(long) handle -> 2852069288, byteCount -> 68
2020-02-11 15:44:56.591 22513-22513/com.cbmob.testapp I/Pull: Changed pull beer sample : Status{activityLevel=BUSY, progress=Progress{completed=0, total=0}, error=null}
2020-02-11 15:44:56.591 22513-22576/com.cbmob.testapp W/CouchbaseLite/NETWORK: C4Socket.write() handle -> 2852069288
2020-02-11 15:44:56.592 22513-22576/com.cbmob.testapp W/CouchbaseLite/NETWORK: completedWrite(long) handle -> 2852069288, byteCount -> 121
2020-02-11 15:44:56.605 22513-22577/com.cbmob.testapp W/CouchbaseLite/NETWORK: C4Socket.completedReceive() handle -> 2852069288
2020-02-11 15:44:56.608 22513-22577/com.cbmob.testapp I/chatty: uid=10086(com.cbmob.testapp) Thread-9 identical 1 line
2020-02-11 15:44:56.612 22513-22577/com.cbmob.testapp W/CouchbaseLite/NETWORK: C4Socket.completedReceive() handle -> 2852069288
2020-02-11 15:44:56.627 22513-22513/com.cbmob.testapp I/Pull: Changed pull beer sample : Status{activityLevel=IDLE, progress=Progress{completed=0, total=0}, error=null}
2020-02-11 15:44:56.628 22513-22513/com.cbmob.testapp E/Replication Comp Log: Scheduler Completed
Очевидно, что изменения документа в БД не регистрируются. Исходя из этого, я предполагаю, что репликация вообще не происходит. Я не уверен, как go отладить это. Если у кого-нибудь есть указания на то, как это можно отладить, я был бы признателен. При необходимости я могу опубликовать журналы syn c gateway.
Если у кого-нибудь есть ссылки на какие-либо блоги или проекты, в которых объясняется, как собрать все части вместе, просим поделиться этим.
С нетерпением жду ответа от людей.