mina,服务器端,如何实现收到某个消息或者某个事件,关闭服务器?
mina初学者,如题,请教各位大侠。
ExecutorService executor = new OrderedThreadPoolExecutor(1005);
acceptor = new NioSocketAcceptor(Runtime.getRuntime().availableProcessors() + 1);
acceptor.getSessionConfig().setReadBufferSize(2048);
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 60);
acceptor.getFilterChain().addLast("executor", new ExecutorFilter(executor));
acceptor.getFilterChain().addLast("logger", new LoggingFilter());
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory));
acceptor.setHandler(handler);
这一套写完了,我如何能用一个机制控制服务器的关闭呢?
在这里直接写acceptor.dispose肯定不是我想要的啊。初步设想,在某个handler里面,接受一个停止服务器的请求,判断一下,然后用session.getService().dispose(true); 来关闭服务器。
我看了一些网上的文档,dispose(true),应该等待其他线程执行完再回收资源,但测试的时候,
debug住第一个action,执行关闭服务器的第二个action(里面有session.getService().dispose(true)),然后继续debug第一个action,是能在服务器端执行完,但此时第一个action的client端已经报错了。
java.io.EOFException
at java.io.DataInputStream.readInt(Unknown Source)
at com.test.CheckTestAction.main(CheckTestAction.java:44)
Exception :java.io.EOFException
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183): [../../../src/share/back/util.c:820]
client端代码:
DefaultMessageParser messageParser = DefaultMessageParser.getInstance();
Socket socket = new Socket("127.0.0.1", 9000);
//。。。。此处省略创建Message相关的操作。
byte[] aa = messageParser.convertBytes(sendMes);
out.write(aa);
out.flush();
in = new DataInputStream(socket.getInputStream());
int length = in.readInt(); //<<<<-----这行出的错,是否是服务器关闭之后,message信息没传回来呢?
byte[] data = new byte[length];
in.read(data);
System.out.println(new String(data, "UTF-8"));
in.close();
session.getService().dispose(true)不是可以等待其他线程执行完再释放service的资源吗?为啥这里报错了?
还是我的写法不对?我是在messageReceived里面判断的,然后执行如下操作:
//判断是关闭服务器操作的action
dispatcher.dispatcher(request, response);
session.getService().dispose(true);
while (true)
{
System.out.println(session.getService().isDisposing() + "," + session.getService().isDisposed());
if(session.getService().isDisposed()){
break;
}
}
值打印了一遍true,true就结束了。那边的第一个action还没执行完呢。何解?
求教大侠指出错误,或者提点一个其他的方法,只要能实现这样的逻辑就行。启动mina服务器端之后,手动执行命令或者请求,让服务器执行一些逻辑操作之后,释放服务器资源,关闭服务器。