Netty的业务逻辑?

时间:2014-06-18 09:19:46

标签: java network-programming netty

我正在开发基于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;
    }
}

2 个答案:

答案 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>