Como você usa CouchDB alterar as notificações contínuas mudanças de Java?
-
08-07-2019 - |
Pergunta
Eu estou tentando usar o couchdb (contínua) muda API do Java e achar que depois de esgotar a lista de mudanças atuais na corrente parece ser fechada, não ficar aberto para sempre, uma vez que é suposto.
O código que estou usando é abaixo. Eu esperaria a nunca desistir do loop while, mas fazer assim que as alterações actualmente existentes estão sendo acabado transmitido. Eu sou relativamente novo para ambos couchdb e Java assim pode estar faltando alguma coisa óbvia. Alguém pode me mostrar como escrever isso corretamente?
URL url = new URL("[path to database here]/_changes?feed=continuous";);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while((line = reader.readLine()) != null){
// do something with the line here
}
// Should never get here under normal circumstances
reader.close();
Solução
Na verdade, há um tempo limite padrão de 60000ms (60 segundos) a menos que um valor de tempo limite diferente ou um batimento cardíaco é fornecida. Eu atualizei o _changes wiki página volta em outubro e incluiu quaisquer incumprimentos me deparei no código .
Definir o batimento cardíaco, basicamente, significa que você vai estar assistindo para um tempo limite no cliente, ou seja, nenhuma nova linha para a pulsação meio período você definitivamente perderam sua conexão. Acredito CouchDB desativa a sua verificação do tempo limite, se há um batimento cardíaco.
Em qualquer caso, você provavelmente deve esperar que a conexão seja fechada em algum ponto e código para essa condição.
Outras dicas
Você pode usar &heartbeat=1000
para obter couchdb envio de novas linhas sobre o fio a cada segundo. Isso irá manter a sua aberto conexão até que você desligue e / ou CouchDB fica desligado.
Mas você está certo, eu também teria esperado que a conexão não vai fechar -. Parece que também conn.setReadTimeout(0);
não ajuda em nada
Este é apenas um palpite desde que eu não sei o suficiente sobre a implementação couchdb continuousfeed ou a implementação HttpURLConnection. Mas parece impedindo quaisquer erros no código dos dois que se seu cliente conexão java tem um conjunto de tempo limite mais baixo do que o batimento cardíaco padrão para couchdb mudanças contínuas, em seguida, a conexão pode ficar terminadas pelo cliente java.
Apenas um pensamento.