最近在基于netty做一些开发,程序基本都跑起来,发现有时偶发出现BlockingOperationException异常,通过连续跟踪程序,基本定位点,但是居然该框架就是故意出错,说不遵守netty的事件机制规则。原文是:
An IllegalStateException which is raised when a user performed a blocking operation when the user is in an event loop thread. If a blocking operation is performed in an event loop thread, the blocking operation will most likely enter a dead lock state, hence throwing this exception.
也就是说居然有可能出错,那就让你出错。
但是从sync/await提供的同步等待接口,就是希望能够进行IO等待处理,结果它抛异常,等待就成了一句空话。
总结一句话:在netty的IO线程之中不能使用sync/await接口,否则就会出现意外错误。
对于目前这种事件响应的接口机制,为了获得同步调用,将需要通过共享一些变量达到要求,只能进行简单同步封装。初步考虑使用:
实现一个ChannelFutureListener的实现类,里面增加一个notify和wait对象,确保operationComplete 来获得准确的发送状态,通知外部状态等候着。