Hi Steve,
which MINA version are you using ?
Steve Ash wrote:
I am trying to create a simple client server application, and am a bit
confused about the intended lifecycles of the acceptor and connector.
Currently, I am doing the following:
1) (Server) NioSocketAcceptor is created and my handler is set
2) (Server) my codec factory is added via protocolfilterChain to
the chain
3) (Server) acceptor is bound to the server address/port and
listens for incoming connections
4) (Client) NioSocketConnector is created
5) (Client) my codec factory is added via protocolFilterChain to
the chain and the handler is set
6) (Client) connects to the server and waitsUninteruptibly on the
connectFuture
7) Client and server exchange request, responses and every goes
swimmingly (just writes, no waiting)
8) (Client) is done, and sends a request to server indicating the
he is done sending work (still just via write method, no
waiting/blocking)
9) (Client) calls session.close().waitUninterruptibly(...);
10) (Server) gets the "done" request and does some business logic
cleanup, then calls session.closeOnFlush();
11) (Client) once the awaitUninterruptibly returns from the
session.close future, calls connector.dispose();
So this is my lifecycle currently, and it is working except that it
appears after my connector.dispose() is called, I get an exception on
the server indicating it is writing to a closed socket.
2008-10-31 15:53:26,591 WARN server.SortStreamIoHandler : Session
encountered a problem:
org.apache.mina.core.write.WriteToClosedSessionException
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.clearWriteReques
tQueue(AbstractPollingIoProcessor.java:521)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.removeNow(Abstra
ctPollingIoProcessor.java:476)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.remove(AbstractP
ollingIoProcessor.java:455)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(Abstr
actPollingIoProcessor.java:58)
at
org.apache.mina.core.polling.AbstractPollingIoProcessor$Worker.run(Abstr
actPollingIoProcessor.java:862)
at
org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.j
ava:51)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecuto
r.java:885)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.ja
va:907)
at java.lang.Thread.run(Thread.java:619)
So I have a few questions that I didn't see clearly explained on the
website that hopefully someone can clear up.
1) When a client is "done" with his processing what is the intended
way to end this exchange-the client closes the session, the server
closes the session, both, or what? This is where I am most confused
about the intended lifecycle of sessions between the server and client.
2) Do I always call connector.dispose() when I am ready to shut
down the entire client or am I missing the point of this method? If I
don't call dispose, my application never quits as the connector thread
doesn't exit.
3) Should I be blocking in the client until the business logic
"done" request comes back (i.e. block on the writeFuture)? So that I
don't close the session until after the server is done sending the "ok"
for the "done" request.
4) What is an example where you would not call dispose. i.e. if
you have a multithreaded client that all talks to the same server?
Would these all go through the same connector?
Thanks so much for any help I can get!
Steve Ash
Metavante Image Solutions
Software Developer
[EMAIL PROTECTED]
--
--
cordialement, regards,
Emmanuel Lécharny
www.iktek.com
directory.apache.org