我们知道,在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,...
Apache Mina是一个高性能的网络应用框架,用于构建可扩展的网络应用,如服务器和客户端。它支持基于TCP/IP和UDP/IP协议的通信,并且可以提供Java对象的序列化服务,以及虚拟机管道通信服务。Mina框架采用事件驱动和...
Apache Mina Server 2.0 是一款强大的网络通信框架,主要设计用于构建高性能、高度可扩展的网络应用程序。它的核心特点在于提供事件驱动和异步IO操作,这得益于其默认基于Java NIO(非阻塞I/O)的底层实现。Mina有两...
服务端接收到数据后,同样会触发读取事件,我们可以在此处理接收到的消息,并广播给其他在线用户。 在mina聊天室的实现中,可能会遇到的问题包括: 1. **并发控制**:随着在线用户的增加,服务端需要处理更多的...
5. **IoService** 和 **IoAcceptor/IoConnector**: IoService是服务端和客户端的抽象,IoAcceptor用于接收客户端连接,IoConnector则用于发起连接到远程服务器。 6. **Thread Model**: Mina允许开发者自定义线程...
Mina是Apache下的一个高效、轻量级的网络通信框架,支持多种传输协议如TCP、UDP等,并提供了丰富的过滤器机制来处理复杂的网络通信任务。其中,`ProtocolCodecFilter`是Mina中用于处理数据编码与解码的核心组件之一...
- **Acceptor**: 服务器端接收客户端连接的组件。 - **Session**: 表示客户端与服务器之间的连接,管理读写操作。 - **Handler**: 处理网络事件的接口,如连接建立、数据读写等。 - **ProtocolDecoder/Encoder**: ...
IoHandler接口定义了处理网络事件的方法集,如连接打开、关闭、异常处理和消息接收/发送。它是Mina框架中业务逻辑的核心载体。 #### 三、Mina与NIO的深度解析 **NIO分析** Mina充分利用了Java NIO技术,对比传统的...
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和...
**MINA**(**M**ulti **I**nterface **N**etwork **A**pplication)是Apache组织下的一款开源网络通信框架,它主要针对TCP/IP、UDP/IP协议栈提供了高效的封装和扩展能力,同时也支持Java对象序列化服务、虚拟机管道...
本报告旨在对比分析两大主流Java网络框架——Apache Mina与JBoss Netty,从功能特性、使用便捷性、性能等方面进行深入探讨。 #### 二、Apache Mina网络通信应用框架 ##### 2.1 概述 Apache Mina是一个基于Java NIO...
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是一个高性能、异步事件驱动的网络应用程序框架,适用于快速...