You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by jv...@apache.org on 2011/05/31 14:31:10 UTC
svn commit: r1129644 - in /mina/branches/3.0/core/src:
main/java/org/apache/mina/ main/java/org/apache/mina/service/
main/java/org/apache/mina/session/ main/java/org/apache/mina/transport/tcp/
main/java/org/apache/mina/transport/tcp/nio/ test/java/org/...
Author: jvermillard
Date: Tue May 31 12:31:10 2011
New Revision: 1129644
URL: http://svn.apache.org/viewvc?rev=1129644&view=rev
Log:
- service activation/unactivation events
- session writing (to be tested)
Modified:
mina/branches/3.0/core/src/main/java/org/apache/mina/IoServiceListener.java
mina/branches/3.0/core/src/main/java/org/apache/mina/service/AbstractIoService.java
mina/branches/3.0/core/src/main/java/org/apache/mina/service/OneThreadSelectorStrategy.java
mina/branches/3.0/core/src/main/java/org/apache/mina/service/SelectorStrategy.java
mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/nio/NioTcpServer.java
mina/branches/3.0/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
mina/branches/3.0/core/src/test/java/org/apache/mina/transport/socket/nio/NioAcceptorTest.java
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/IoServiceListener.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/IoServiceListener.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/IoServiceListener.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/IoServiceListener.java Tue May 31 12:31:10 2011
@@ -32,31 +32,26 @@ public interface IoServiceListener exten
*
* @param service the {@link IoService}
*/
- void serviceActivated(IoService service) throws Exception;
+ void serviceActivated(IoService service);
/**
- * Invoked when a service is idle.
- */
- void serviceIdle(IoService service, IdleStatus idleStatus) throws Exception;
-
- /**
* Invoked when a service is deactivated by an {@link IoService}.
*
* @param service the {@link IoService}
*/
- void serviceDeactivated(IoService service) throws Exception;
+ void serviceDeactivated(IoService service);
/**
* Invoked when a new session is created by an {@link IoService}.
*
* @param session the new session
*/
- void sessionCreated(IoSession session) throws Exception;
+ void sessionCreated(IoSession session);
/**
* Invoked when a session is being destroyed by an {@link IoService}.
*
* @param session the session to be destroyed
*/
- void sessionDestroyed(IoSession session) throws Exception;
+ void sessionDestroyed(IoSession session);
}
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/service/AbstractIoService.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/service/AbstractIoService.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/service/AbstractIoService.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/service/AbstractIoService.java Tue May 31 12:31:10 2011
@@ -38,12 +38,12 @@ import org.slf4j.LoggerFactory;
public abstract class AbstractIoService implements IoService {
/** A logger for this class */
static final Logger LOG = LoggerFactory.getLogger(AbstractIoService.class);
-
+
/** The service state */
private ServiceState state;
-
+
private final Map<Long, IoSession> managedSessions = new ConcurrentHashMap<Long, IoSession>();
-
+
/**
* The handler, the interface with the application part.
*/
@@ -52,8 +52,8 @@ public abstract class AbstractIoService
/**
* Placeholder for storing all the listeners added
*/
- private final List<IoServiceListener> listeners = new CopyOnWriteArrayList<IoServiceListener>();
-
+ private final List<IoServiceListener> listeners = new CopyOnWriteArrayList<IoServiceListener>();
+
/**
* The Service states
*/
@@ -71,7 +71,7 @@ public abstract class AbstractIoService
/** The service is stopped */
DISPOSED
}
-
+
/**
* Create an AbstractIoService
*/
@@ -90,7 +90,7 @@ public abstract class AbstractIoService
*/
@Override
public void addListener(IoServiceListener listener) {
- if(listener != null) {
+ if (listener != null) {
listeners.add(listener);
return;
}
@@ -104,12 +104,11 @@ public abstract class AbstractIoService
*/
@Override
public void removeListener(IoServiceListener listener) {
- if(listener != null) {
- listeners.remove(listener);
+ if (listener != null) {
+ listeners.remove(listener);
}
}
-
/**
* {@inheritDoc}
*/
@@ -117,7 +116,6 @@ public abstract class AbstractIoService
return handler;
}
-
/**
* {@inheritDoc}
*/
@@ -137,81 +135,99 @@ public abstract class AbstractIoService
this.handler = handler;
}
-
+
/**
* @return true if the IoService is active
*/
public boolean isActive() {
return state == ServiceState.ACTIVE;
}
-
+
/**
* @return true if the IoService is being disposed
*/
public boolean isDisposing() {
return state == ServiceState.DISPOSING;
}
-
+
/**
* @return true if the IoService is disposed
*/
public boolean isDisposed() {
return state == ServiceState.DISPOSED;
}
-
+
/**
* @return true if the IoService is suspended
*/
public boolean isSuspended() {
return state == ServiceState.SUSPENDED;
}
-
+
/**
* @return true if the IoService is created
*/
public boolean isCreated() {
return state == ServiceState.CREATED;
}
-
+
/**
* Sets the IoService state to CREATED.
*/
protected void setCreated() {
state = ServiceState.CREATED;
}
-
+
/**
* Sets the IoService state to ACTIVE.
*/
protected void setActive() {
state = ServiceState.ACTIVE;
}
-
+
/**
* Sets the IoService state to DISPOSED.
*/
protected void setDisposed() {
state = ServiceState.DISPOSED;
}
-
+
/**
* Sets the IoService state to DISPOSING.
*/
protected void setDisposing() {
state = ServiceState.DISPOSING;
}
-
+
/**
* Sets the IoService state to SUSPENDED.
*/
protected void setSuspended() {
state = ServiceState.SUSPENDED;
}
-
+
/**
* Initialize the IoService state
*/
protected void initState() {
state = ServiceState.NONE;
}
+
+ /**
+ * Inform all current the listeners of the service activation.
+ */
+ protected void fireServiceActivated() {
+ for (IoServiceListener listener : listeners) {
+ listener.serviceActivated(this);
+ }
+ }
+
+ /**
+ * Inform all current the listeners of the service desactivation.
+ */
+ protected void fireServiceDeactivated() {
+ for (IoServiceListener listener : listeners) {
+ listener.serviceDeactivated(this);
+ }
+ }
}
\ No newline at end of file
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/service/OneThreadSelectorStrategy.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/service/OneThreadSelectorStrategy.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/service/OneThreadSelectorStrategy.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/service/OneThreadSelectorStrategy.java Tue May 31 12:31:10 2011
@@ -22,6 +22,8 @@ package org.apache.mina.service;
import java.io.IOException;
import java.net.SocketAddress;
+import org.apache.mina.IoSession;
+
/**
* A strategy for using only one thread, for accepting and processing all
@@ -53,6 +55,11 @@ public class OneThreadSelectorStrategy i
}
@Override
+ public SelectorProcessor getSelectorForWrite(IoSession session) {
+ return processor;
+ }
+
+ @Override
public void unbind(SocketAddress address) throws IOException {
processor.unbind(address);
}
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/service/SelectorStrategy.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/service/SelectorStrategy.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/service/SelectorStrategy.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/service/SelectorStrategy.java Tue May 31 12:31:10 2011
@@ -39,6 +39,15 @@ public interface SelectorStrategy {
SelectorProcessor getSelectorForNewSession(SelectorProcessor acceptingProcessor);
/**
+ * Provide a {@link SelectorProcessor} for a {@link IoSession} which need to write data.
+ * This processor will be in charge of selecting the socket for write ready events.
+ *
+ * @param session the session in need of writing
+ * @return the selector processor for handling this sessino write events
+ */
+ SelectorProcessor getSelectorForWrite(IoSession session);
+
+ /**
* Provide a {@link SelectorProcessor} for processing a newly bound address.
* The processor will accept the incoming connections.
* @return
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/session/AbstractIoSession.java Tue May 31 12:31:10 2011
@@ -86,12 +86,15 @@ public abstract class AbstractIoSession
* {@link IoSession#getId()}) and an associated {@link IoService}
*
* @param service the service this session is associated with
+ * @param writeProcessor the processor in charge of processing this session write queue
*/
- public AbstractIoSession(IoService service) {
+ public AbstractIoSession(IoService service, SelectorProcessor writeProcessor) {
// generated a unique id
id = NEXT_ID.getAndIncrement();
creationTime = System.currentTimeMillis();
this.service = service;
+ this.writeProcessor = writeProcessor;
+
LOG.debug("Created new session with id : {}", id);
synchronized (stateMonitor) {
this.state=SessionState.CREATED;
@@ -218,7 +221,7 @@ public abstract class AbstractIoSession
writeQueue.add(new DefaultWriteRequest(message));
// If it wasn't, we register this session as interested to write.
- // It's done in atomic fashion for avoiding two concurent registering.
+ // It's done in atomic fashion for avoiding two concurrent registering.
if (!registeredForWrite.getAndSet(true)) {
writeProcessor.flush(this);
}
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioSelectorProcessor.java Tue May 31 12:31:10 2011
@@ -47,7 +47,7 @@ import org.slf4j.LoggerFactory;
/**
*
- * A {@link SelectorProcessor} for processing NIO based {@link IoSession}.
+ * A {@link SelectorProcessor} for processing NIO based {@link IoSession}.
*
* @author <a href="http://mina.apache.org">Apache MINA Project</a>
*
@@ -67,21 +67,22 @@ public class NioSelectorProcessor implem
private ByteBuffer readBuffer;
- /**
- * new binded server to add to the selector
- * {ServerSocketChannel, IoServer}
+ /**
+ * new binded server to add to the selector {ServerSocketChannel, IoServer}
*/
private final Queue<Object[]> serversToAdd = new ConcurrentLinkedQueue<Object[]>();
/** server to remove of the selector */
private final Queue<ServerSocketChannel> serversToRemove = new ConcurrentLinkedQueue<ServerSocketChannel>();
- /** new session freshly accepted, placed here for being added to the selector */
+ /**
+ * new session freshly accepted, placed here for being added to the selector
+ */
private final Queue<NioTcpSession> sessionsToConnect = new ConcurrentLinkedQueue<NioTcpSession>();
/** session to be removed of the selector */
private final Queue<NioTcpSession> sessionsToClose = new ConcurrentLinkedQueue<NioTcpSession>();
-
+
/** A queue used to store the sessions to be flushed */
private final Queue<NioTcpSession> flushingSessions = new ConcurrentLinkedQueue<NioTcpSession>();
@@ -147,7 +148,8 @@ public class NioSelectorProcessor implem
public void createSession(IoService service, Object clientSocket) {
log.debug("create session");
SocketChannel socketChannel = (SocketChannel) clientSocket;
- NioTcpSession session = new NioTcpSession((NioTcpServer) service, socketChannel);
+ NioTcpSession session = new NioTcpSession((NioTcpServer) service, socketChannel,
+ strategy.getSelectorForNewSession(this));
// TODO : configure
try {
@@ -239,7 +241,7 @@ public class NioSelectorProcessor implem
log.debug("selecting...");
int readyCount = selector.select(SELECT_TIMEOUT);
log.debug("... done selecting : {}", readyCount);
-
+
if (readyCount > 0) {
// process selected keys
@@ -273,20 +275,31 @@ public class NioSelectorProcessor implem
}
if (key.isWritable()) {
- log.debug("writable client {}", key);
- NioTcpSession session = (NioTcpSession) key.attachment();
- // write from the session write queue
- WriteQueue queue = session.getWriteQueue();
- do {
- // get a write request from the queue
- WriteRequest wr = queue.poll();
- if (wr == null) {
- break;
- }
- // TODO : write it
-
- } while(!queue.isEmpty());
-
+ log.debug("writable client {}", key);
+ NioTcpSession session = (NioTcpSession) key.attachment();
+ // write from the session write queue
+ WriteQueue queue = session.getWriteQueue();
+ do {
+ // get a write request from the queue
+ WriteRequest wreq = queue.peek();
+ if (wreq == null) {
+ break;
+ }
+ ByteBuffer buf = (ByteBuffer) wreq.getMessage();
+ int wrote = session.getSocketChannel().write(buf);
+ if (buf.remaining() == 0) {
+ // completed write request, let's remove
+ // it
+ queue.remove();
+ } else {
+ // output socket buffer is full, we need
+ // to give up until next selection for
+ // writing
+ break;
+ }
+
+ } while (!queue.isEmpty());
+
}
if (key.isAcceptable()) {
@@ -303,23 +316,26 @@ public class NioSelectorProcessor implem
}
}
-
- // registering session with data in the write queue for writing
+
+ // registering session with data in the write queue for
+ // writing
while (!flushingSessions.isEmpty()) {
- NioTcpSession session = flushingSessions.poll();
- // a key registered for read ? (because we can have a Selector for reads and another for the writes
- SelectionKey readKey = sessionReadKey.get(session);
- if (readKey != null) {
- readKey.cancel();
- // register for read/write
- SelectionKey key = session.getSocketChannel().register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
+ NioTcpSession session = flushingSessions.poll();
+ // a key registered for read ? (because we can have a
+ // Selector for reads and another for the writes
+ SelectionKey readKey = sessionReadKey.get(session);
+ if (readKey != null) {
+ readKey.cancel();
+ // register for read/write
+ SelectionKey key = session.getSocketChannel().register(selector,
+ SelectionKey.OP_READ | SelectionKey.OP_WRITE);
key.attach(session);
sessionReadKey.put(session, key);
-
- } else {
- SelectionKey key = session.getSocketChannel().register(selector, SelectionKey.OP_WRITE);
- key.attach(session);
- }
+
+ } else {
+ SelectionKey key = session.getSocketChannel().register(selector, SelectionKey.OP_WRITE);
+ key.attach(session);
+ }
}
} catch (IOException e) {
log.error("IOException while selecting selector", e);
@@ -336,12 +352,12 @@ public class NioSelectorProcessor implem
}
}
- @Override
- public void flush(IoSession session) {
- log.debug("scheduling session {} for writing",session.toString());
- // add the session to the list of session to be registered for writing
- // wake the selector
- flushingSessions.add((NioTcpSession)session);
- wakeupWorker();
- }
+ @Override
+ public void flush(IoSession session) {
+ log.debug("scheduling session {} for writing", session.toString());
+ // add the session to the list of session to be registered for writing
+ // wake the selector
+ flushingSessions.add((NioTcpSession) session);
+ wakeupWorker();
+ }
}
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/NioTcpSession.java Tue May 31 12:31:10 2011
@@ -25,6 +25,7 @@ import java.nio.channels.SocketChannel;
import org.apache.mina.CloseFuture;
import org.apache.mina.IoSessionConfig;
+import org.apache.mina.service.SelectorProcessor;
import org.apache.mina.session.AbstractIoSession;
import org.apache.mina.transport.tcp.nio.NioTcpServer;
@@ -35,18 +36,18 @@ import org.apache.mina.transport.tcp.nio
*
*/
public class NioTcpSession extends AbstractIoSession {
-
+
private SocketChannel channel;
-
- NioTcpSession(NioTcpServer service,SocketChannel channel) {
- super(service);
+
+ NioTcpSession(NioTcpServer service, SocketChannel channel, SelectorProcessor writeProcessor) {
+ super(service, writeProcessor);
this.channel = channel;
}
public SocketChannel getSocketChannel() {
return channel;
}
-
+
/**
* {@inheritDoc}
*/
@@ -56,7 +57,7 @@ public class NioTcpSession extends Abstr
return null;
}
Socket socket = channel.socket();
-
+
if (socket == null) {
return null;
}
@@ -69,20 +70,19 @@ public class NioTcpSession extends Abstr
*/
@Override
public InetSocketAddress getLocalAddress() {
- if ( channel == null ) {
+ if (channel == null) {
return null;
}
-
+
Socket socket = channel.socket();
-
- if ( socket == null ) {
+
+ if (socket == null) {
return null;
}
-
+
return (InetSocketAddress) socket.getLocalSocketAddress();
}
-
@Override
public boolean isConnected() {
// TODO Auto-generated method stub
@@ -104,25 +104,25 @@ public class NioTcpSession extends Abstr
@Override
public void suspendRead() {
// TODO Auto-generated method stub
-
+
}
@Override
public void suspendWrite() {
// TODO Auto-generated method stub
-
+
}
@Override
public void resumeRead() {
// TODO Auto-generated method stub
-
+
}
@Override
public void resumeWrite() {
// TODO Auto-generated method stub
-
+
}
@Override
@@ -147,6 +147,6 @@ public class NioTcpSession extends Abstr
if (getState() != SessionState.CREATED) {
throw new RuntimeException("Trying to open a non created session");
}
- state = SessionState.CONNECTED;
+ state = SessionState.CONNECTED;
}
}
\ No newline at end of file
Modified: mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/nio/NioTcpServer.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/nio/NioTcpServer.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/nio/NioTcpServer.java (original)
+++ mina/branches/3.0/core/src/main/java/org/apache/mina/transport/tcp/nio/NioTcpServer.java Tue May 31 12:31:10 2011
@@ -40,8 +40,7 @@ public class NioTcpServer extends Abstra
static final Logger LOG = LoggerFactory.getLogger(NioTcpServer.class);
// list of bound addresses
- private Set<SocketAddress> addresses = Collections
- .synchronizedSet(new HashSet<SocketAddress>());
+ private Set<SocketAddress> addresses = Collections.synchronizedSet(new HashSet<SocketAddress>());
// map of the created selection keys, mainly used for cancelling them.
// private Map<SocketAddress,NioSelectorProcessor> serverSocketChannels =
@@ -66,16 +65,18 @@ public class NioTcpServer extends Abstra
// check if the address is already bound
synchronized (this) {
if (addresses.contains(address)) {
- throw new IOException("address " + address
- + " already bound");
+ throw new IOException("address " + address + " already bound");
}
LOG.debug("binding address {}", address);
addresses.add(address);
- NioSelectorProcessor processor = (NioSelectorProcessor) strategy
- .getSelectorForBindNewAddress();
- processor.bindAndAcceptAddress(this,address);
+ NioSelectorProcessor processor = (NioSelectorProcessor) strategy.getSelectorForBindNewAddress();
+ processor.bindAndAcceptAddress(this, address);
+ if (addresses.size() == 1) {
+ // it's the first address bound, let's fire the event
+ fireServiceActivated();
+ }
}
}
}
@@ -92,6 +93,9 @@ public class NioTcpServer extends Abstra
synchronized (this) {
strategy.unbind(socketAddress);
addresses.remove(socketAddress);
+ if (addresses.isEmpty()) {
+ fireServiceDeactivated();
+ }
}
}
}
Modified: mina/branches/3.0/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java (original)
+++ mina/branches/3.0/core/src/test/java/org/apache/mina/session/AbstractIoSessionTest.java Tue May 31 12:31:10 2011
@@ -13,7 +13,7 @@ public class AbstractIoSessionTest {
private final class DummySession extends AbstractIoSession {
private DummySession(IoService service) {
- super(service);
+ super(service,null);
}
@Override
Modified: mina/branches/3.0/core/src/test/java/org/apache/mina/transport/socket/nio/NioAcceptorTest.java
URL: http://svn.apache.org/viewvc/mina/branches/3.0/core/src/test/java/org/apache/mina/transport/socket/nio/NioAcceptorTest.java?rev=1129644&r1=1129643&r2=1129644&view=diff
==============================================================================
--- mina/branches/3.0/core/src/test/java/org/apache/mina/transport/socket/nio/NioAcceptorTest.java (original)
+++ mina/branches/3.0/core/src/test/java/org/apache/mina/transport/socket/nio/NioAcceptorTest.java Tue May 31 12:31:10 2011
@@ -26,6 +26,9 @@ import java.net.SocketAddress;
import junit.framework.Assert;
+import org.apache.mina.IoService;
+import org.apache.mina.IoServiceListener;
+import org.apache.mina.IoSession;
import org.apache.mina.service.OneThreadSelectorStrategy;
import org.apache.mina.service.SelectorFactory;
import org.apache.mina.transport.tcp.NioSelectorProcessor;
@@ -52,9 +55,32 @@ public class NioAcceptorTest {
OneThreadSelectorStrategy strategy = new OneThreadSelectorStrategy(
new SelectorFactory(NioSelectorProcessor.class));
NioTcpServer acceptor = new NioTcpServer(strategy);
- SocketAddress address = new InetSocketAddress(9999);
+ acceptor.addListener(new IoServiceListener() {
+
+ @Override
+ public void sessionDestroyed(IoSession session) {
+ LOG.info("session destroyed {}",session);
+ }
+
+ @Override
+ public void sessionCreated(IoSession session) {
+ LOG.info("session created {}",session);
+ }
+
+ @Override
+ public void serviceDeactivated(IoService service) {
+ LOG.info("service deactivated {}",service);
+ }
+
+ @Override
+ public void serviceActivated(IoService service) {
+ LOG.info("service activated {}",service);
+ }
+ });
+
try {
+ SocketAddress address = new InetSocketAddress(9999);
acceptor.bind(address);
LOG.debug("Waiting 25 sec");
Thread.sleep(25000);