mina,服务器端,如何实现收到某个消息或者某个事件,关闭服务器?

playingall 2014-03-20 06:55:36
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服务器端之后,手动执行命令或者请求,让服务器执行一些逻辑操作之后,释放服务器资源,关闭服务器。

...全文
597 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
playingall 2014-05-06
  • 打赏
  • 举报
回复
后来又试了一下,服务器这边的线程没断,只不过客户端和服务器的连接断了。服务器这边还可以继续执行。逻辑没有错误。
yinrongg 2014-04-09
  • 打赏
  • 举报
回复
关闭session就可以吧
去旅行吧 2014-04-05
  • 打赏
  • 举报
回复
貌似在客户度关闭的时候调用session.getService().dispose(true);可以关闭服务器
cchvsgame 2014-04-04
  • 打赏
  • 举报
回复
shudown -r

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧