我正在开发基于Netty libraby的服务器,而且我对如何根据业务逻辑构建应用程序存在问题。
currenty我在最后一个处理程序中有业务逻辑,以及我访问数据库的地方。我无法解决的问题是访问数据库的延迟(阻塞代码)。是不建议在处理程序中执行此操作还是有替代方法?代码如下:
public void channelRead(ChannelHandlerContext ctx, Object msg)
throws Exception {
super.channelRead(ctx, msg);
Msg message = (Msg)msg;
switch(message.messageType){
case MType.SIGN_UP:
userReg.signUp(message.user);// blocking database access
break;
}
}
答案 0 :(得分:1)
你应该在DefaultEventExecutorGroup
或你的自定义线程池中执行阻塞调用,这些调用可以在添加处理程序时添加
pipeline.addLast(new DefaultEventExecutorGroup(50),"BUSSINESS_LOGIC_HANDLER", new BHandler());
ctx.executor().execute(new Runnable() {
@Override
public void run() {
//Blocking call
}});
答案 1 :(得分:0)
每当服务器收到请求时,Netty都会初始化您的自定义处理程序,因此处理程序的一个实例负责处理一个客户端。
因此,在处理程序中发出阻塞调用是完全正常的。它不会影响其他客户端,只要您不会无限期地阻止它(或者至少不会很长时间),从而不会长时间阻塞Netty的线程,并且不会对服务器实例造成太大的负担。
但是,如果您想进行异步设计,那么您可以使用多种设计模式。
例如。使用Netty,如果你可以实现 WebSockets ,那么也许你可以在一个单独的线程中进行阻塞调用,当结果可用时,你可以通过已建立的WebSocket将它们推送到客户端。 / em>