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);