我们知道,在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
相关推荐
它负责监听指定的网络端口,接收客户端的连接请求,并为每个连接创建一个Session。Session是MINA的核心概念,它代表了服务端与客户端之间的一个连接实例。服务端通过定义Filter Chain(过滤器链)来处理接收到的数据...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展且功能丰富的网络应用程序框架,主要用于简化开发高性能且异步的网络应用。MINA提供了一种统一的API,无论是TCP还是UDP,...
服务端接收到数据后,同样会触发读取事件,我们可以在此处理接收到的消息,并广播给其他在线用户。 在mina聊天室的实现中,可能会遇到的问题包括: 1. **并发控制**:随着在线用户的增加,服务端需要处理更多的...
5. **IoService** 和 **IoAcceptor/IoConnector**: IoService是服务端和客户端的抽象,IoAcceptor用于接收客户端连接,IoConnector则用于发起连接到远程服务器。 6. **Thread Model**: Mina允许开发者自定义线程...
- **Acceptor**: 服务器端接收客户端连接的组件。 - **Session**: 表示客户端与服务器之间的连接,管理读写操作。 - **Handler**: 处理网络事件的接口,如连接建立、数据读写等。 - **ProtocolDecoder/Encoder**: ...
1. **计算器服务**:MINA可以轻松构建一个简单的网络计算器服务,客户端发送计算请求,服务器端接收到请求后进行计算并返回结果。这个示例展示了MINA的基本使用,包括创建ServerBootstrap、设置过滤器链、定义...
Acceptor负责监听指定端口,接收客户端的连接请求;Connector则用于建立到服务器的连接。在Android端,由于系统特性,可能需要处理权限问题,确保应用有访问网络的权限。 断线重连机制是解决网络不稳定情况下的必备...
Apache MINA(Model-View-Controller for Network Applications)是一个高性能、异步的网络应用程序开发框架。它允许开发者以事件驱动的方式处理网络I/O操作,提高了系统性能。MINA支持多种传输类型,包括TCP/IP、...
MINA(Multi-purpose Infrastructure for Network Applications)是一个高度可扩展的、高性能的Java网络应用框架,由Apache软件基金会开发并维护。它为开发者提供了简单、高效的API来处理网络通信,尤其是在TCP/IP和...
3. **客户端开发**:客户端通常需要实现与服务端的连接、身份验证、消息发送和接收等功能。JavaFX或Swing可以用于构建桌面应用,而Android SDK则用于移动端开发。 4. **消息传输**:在Java中,可以使用对象序列化或...
1. **Java编程**:Java提供了丰富的库和框架,如Swing或JavaFX用于构建用户界面,Socket编程用于网络通信,以及像Apache MINA或Netty这样的NIO框架来优化高并发连接。通过Java,开发者可以构建稳定、高效的客户端...
MINA(Multipurpose Infrastructure for Network Applications)是Apache软件基金会的一个开源项目,提供了一个可扩展的网络应用框架,用于简化跨平台的网络编程,尤其是TCP和UDP协议的应用。MINA对于实现Android...
2. Mina:Apache Mina是一个网络通信框架,提供了一组高度模块化的组件,可以方便地构建高性能的TCP/IP和UDP服务,适用于开发IM服务器。 3. Netty:Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于快速...
2. **服务端模块**:接收客户端发送的游戏日志,利用Disruptor进行消息缓存,避免直接写入数据库导致的性能问题。 3. **数据库处理模块**:由单独的线程负责,从Disruptor的缓冲区取出日志消息,转化为SQL语句,通过...
- **会话模块**:实现一对一和群组聊天功能,包括消息发送、接收、存储和同步。 - **联系人管理模块**:存储和查找联系人,显示在线状态,管理好友列表。 - **文件传输模块**:支持文件发送和接收,可能涉及断点...
首先,Java作为一种跨平台的编程语言,拥有丰富的库和框架支持,如Netty、Apache MINA等,这些都为游戏服务器的开发提供了便利。Netty是一个高性能的异步事件驱动的网络应用程序框架,适用于开发服务器和客户端应用...
Openfire的插件机制允许扩展以与其他通讯软件互操作,使用Apache Mina框架提供高性能的网络连接和异步I/O处理。 即时通讯在Android上的实现需要考虑网络条件、性能优化、用户体验和安全防护等多个方面。通过合理的...
8. **框架与库**: 为了简化开发,Chat-engine可能使用了如Spring Framework、Netty或Apache Mina等网络通信框架,它们提供了高级抽象和性能优化,使开发者能专注于业务逻辑而不是底层细节。 9. **安全性**: 考虑到...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...
在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息的内容。同时一个mail note将被发送给消息发送者,发送一个e-mail通知给由recipient参数确定的e-...