Le 7/16/13 11:29 AM, Jose María Zaragoza a écrit :
> Hello:
>
> I'm using Mina 2.0.7 and I'm getting this error where close a session
>
>
> java.lang.IllegalStateException: DEAD LOCK: IoFuture.await() was invoked
> from an I/O processor thread.  Please use IoFutureListener or configure a
> proper thread model alternatively.
>
>       at
> org.apache.mina.core.future.DefaultIoFuture.checkDeadLock(DefaultIoFuture.java:240)
>
>       at
> org.apache.mina.core.future.DefaultIoFuture.await0(DefaultIoFuture.java:210)
>
>       at
> org.apache.mina.core.future.DefaultIoFuture.awaitUninterruptibly(DefaultIoFuture.java:153)
>
>
> I'm closing session with the next code:
>
> if (this.session != null)
> {
>
> CloseFuture future = this.session.close(false);
> future.await(10000);
> if (!future.isClosed())
> throw new Exception("Disconnect timeout after waiting 10 seconds");
> }
>
> What could be the right solution?

You can't close the session and wait for the future to be completed, as
the future will be updated by the thread you are on.

Let me explain what's going on :
- you are on a thread that handle the session. You require this session
to be closed.
- the current thread will update a set with the session to be closed
- the main server thread will process this set when it will be able to
do it (ie, probably in the next few ms after you closed the session)
- it's very likely that the main server thread will reuse the same
thread than the one you hold for the session (unless you specifically
tell the server to manage threads differently, it will *always* use the
same thread for a given session. If you have, say, three IoProcessor,
you will have three threads created, and all the sessions will be evenly
spreaded on those three threads, but each session will always use the
same thread)
- and as you hold the thread waiting for the future to be completed,
this thread can't be used to update the future status by the main server
thread...

what exactly are you trying to do with the check on the session timeout
? You can most certainly use the idle event to manage the timeout...


-- 
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com 

Reply via email to