/** * Logs out of the current IMAP session and releases all resources, including executor services. */ @Override public synchronized void disconnect() { try { // If there is an error with the handler, dont bother logging out. if (!mailClientHandler.isHalted()) { if (mailClientHandler.idleRequested.get()) { log.warn("Disconnect called while IDLE, leaving idle and logging out."); done(); } // Log out of the IMAP Server. channel.write(". logout\n"); } currentFolder = null; } catch (Exception e) { // swallow any exceptions. } finally { // Shut down all channels and exit (leave threadpools as is--for reconnects). // The Netty channel close listener will fire a disconnect event to our client, // automatically. See connect() for details. try { channel.close().awaitUninterruptibly(config.getTimeout(), TimeUnit.MILLISECONDS); } catch (Exception e) { // swallow any exceptions. } finally { mailClientHandler.idleAcknowledged.set(false); mailClientHandler.disconnected(); if (disconnectListener != null) disconnectListener.disconnected(); } } }
private void disconnectAbnormally(String message) { try { halt(); // Disconnect abnormally. The user code should reconnect using the mail client. errorStack.push(new Error(completions.poll(), message, wireTrace.list())); idler.disconnect(); } finally { disconnected(); } }
private void reset() { Preconditions.checkState( !isConnected(), "Cannot reset while mail client is still connected (call disconnect() first)."); // Just to be on the safe side. if (mailClientHandler != null) { mailClientHandler.halt(); mailClientHandler.disconnected(); } this.mailClientHandler = new MailClientHandler(this, config); MailClientPipelineFactory pipelineFactory = new MailClientPipelineFactory(mailClientHandler, config); this.bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(bossPool, workerPool)); this.bootstrap.setPipelineFactory(pipelineFactory); // Reset state (helps if this is a reconnect). this.currentFolder = null; this.sequence.set(0L); mailClientHandler.idleRequested.set(false); }