Thank you for the answer
I create two replicator with this functions, in the same class :
public void configureUserReplication() throws FleetException {
ReplicatorConfiguration replConfig = new ReplicatorConfiguration(mDatabase, mTargetEndpoint);
replConfig.setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL);
replConfig.setContinuous(true);
replConfig.setAuthenticator(new BasicAuthenticator(mUser, mPassword));
List<String> channels = new ArrayList<>();
channels.add("!");
channels.add("user:" + mUser);
replConfig.setChannels(channels);
mUserReplicator = new Replicator(replConfig);
ListenerToken tk = mUserReplicator.addChangeListener(new ReplicatorChangeListener() {
@Override
public void changed(ReplicatorChange change) {
if (change.getStatus().getError() != null) {
Log.i(TAG, "Error code :: " + change.getStatus().getError().getCode());
switch (change.getStatus().getError().getCode()) {
case 10401:
mOnCatchLoginError.CatchLoginError();
break;
default:
break;
}
}
}
});
mUserReplicator.start();
mReplicatorList.add(mUserReplicator);
}
public void configureCompanyReplication(String companyId) throws FleetException {
ReplicatorConfiguration replConfig = new ReplicatorConfiguration(mDatabase, mTargetEndpoint);
replConfig.setReplicatorType(ReplicatorConfiguration.ReplicatorType.PUSH_AND_PULL);
replConfig.setContinuous(true);
replConfig.setAuthenticator(new BasicAuthenticator(mUser, mPassword));
List<String> channels = new ArrayList<>();
channels.add("company:" + companyId);
channels.add("mission_status_type:" + companyId);
channels.add("mission_action_type:" + companyId);
replConfig.setChannels(channels);
mCompanyReplicator = new Replicator(replConfig);
mCompanyReplicator.start();
mReplicatorList.add(mCompanyReplicator);
}
and here my release function :
/**
* Close database and delete if required.
* This function is blocking.
*
* @param deleteDB database deleting option
* @throws FleetException
*/
public void release(final boolean deleteDB) throws FleetException {
for (Replicator r : mReplicatorList) {
try {
stopContinuousReplicator(r);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
if (deleteDB)
mDatabase.delete();
else
mDatabase.close();
} catch (CouchbaseLiteException e) {
throw new FleetException("Error during database closing", e);
}
}
private void stopContinuousReplicator(Replicator repl) throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(1);
ListenerToken token = repl.addChangeListener(new ReplicatorChangeListener() {
@Override
public void changed(ReplicatorChange change) {
Replicator.Status status = change.getStatus();
if (status.getActivityLevel() == Replicator.ActivityLevel.STOPPED) {
latch.countDown();
}
}
});
try {
repl.stop();
latch.await(10, TimeUnit.SECONDS);
} finally {
repl.removeChangeListener(token);
}
}
Sometimes the timeout exceed and mDatabase.close()
is caled during a replicator is running (I tryed with with longer timeout > 1 hour).