MINA2的一个BUG

   我们知道,在MINA2中,发送和接受时两个独立的工作线程,但是可以设置一个参数,当服务端发送消息之后同步读取客户端的返回:
session.getConfig().setUseReadOperation(true);


近日,采用MINA2(RC)的同步读取方法,发现无法真的同步读取客户端的返回;
场景是:服务端发送一个消息给客户端,需要同步等待客户端的一个消息回执,然后服务端的程序继续执行;
 
sendSession.getConfig().setUseReadOperation(true);
		WriteFuture future = sendSession.write(xmlMsgBean); // 发送数据
		future.awaitUninterruptibly(); // 等待发送数据操作完成
		if (future.getException() != null) {
			throw new AppException(future.getException().getMessage());
		}
		if (future.isWritten()) {
			// 数据已经被成功发送
			logger.debug("数据已经被成功发送");
			ReadFuture readFuture = sendSession.read();
			readFuture.awaitUninterruptibly();
			if (readFuture.getException() != null) {
				throw new AppException(readFuture.getException().getMessage());
			}
			sendSession.getConfig().setUseReadOperation(false);
			return ((XmlMsgBean) readFuture.getMessage()).getStrErrMsg();
		} else {
			// 数据发送失败
			logger.debug("数据发送失败");
		}
  




  后来用GOOGLE搜索了一下,发现在MINA的官网上,老外同样问了一个一模一样的问题,并且提了一个BUG上去,但是目前BUG的状态还是open;
  https://issues.apache.org/jira/browse/DIRMINA-777
 
I'm attempting to perform a synchronous write/read in a demux-based client application with MINA 2.0 RC1, but it seems to get stuck. Here is my code: 

{code} 
public boolean login(final String username, final String password) { 
    // block inbound messages 
    session.getConfig().setUseReadOperation(true); 

    // send the login request 
    final LoginRequest loginRequest = new LoginRequest(username, password); 
    final WriteFuture writeFuture = session.write(loginRequest); 
    writeFuture.awaitUninterruptibly(); 

    if (writeFuture.getException() != null) { 
        session.getConfig().setUseReadOperation(false); 
        return false; 
    } 

    // retrieve the login response 
    final ReadFuture readFuture = session.read(); 
    readFuture.awaitUninterruptibly(); 

    if (readFuture.getException() != null) { 
        session.getConfig().setUseReadOperation(false); 
        return false; 
    } 

    // stop blocking inbound messages 
    session.getConfig().setUseReadOperation(false); 

    // determine if the login info provided was valid 
    final LoginResponse loginResponse = (LoginResponse)readFuture.getMessage(); 
    return loginResponse.getSuccess(); 
} 
{code} 

I can see on the server side that the LoginRequest object is retrieved, and a LoginResponse message is sent. On the client side, the DemuxingProtocolCodecFactory receives the response, but after throwing in some logging, I can see that the client gets stuck on the call to `readFuture.awaitUninterruptibly() `. 

I can't for the life of me figure out why it is stuck here based upon my own code. I properly set the read operation to true on the session config, meaning that messages should be blocked. However, it seems as if the message no longer exists by time I try to read response messages synchronously.

 
Key: DIRMINA-777 
Type:  Bug 
Status:  Open 
Priority:  Blocker 
Assignee: Unassigned 
Reporter: Matt Huggins 
Votes: 0 
Watchers: 0 



你可能感兴趣的:(apache,工作,Google,Mina)