`

mina实现相同session后到的请求一定后处理的原理

 
阅读更多
mina后面的业务处理是一个线程池去处理的,在线程池的多线程的情况下,一般是不能保证后面的请求一定后处理的。因为可能后面的线程处理更快。
mina是怎么做到的呢:
基本原理是 每个session有个自己的queue,而且相同这个queue的元素一定在同一个线程处理

具体原理:
mina使用的是OrderedThreadPoolExecutor,具体的处理是Worker

for (;;) {
                    IoSession session = fetchSession();

                    idleWorkers.decrementAndGet();

                    if (session == null) {
                        synchronized (workers) {
                            if (workers.size() > getCorePoolSize()) {
                                // Remove now to prevent duplicate exit.
                                workers.remove(this);
                                break;
                            }
                        }
                    }

                    if (session == EXIT_SIGNAL) {
                        break;
                    }

                    try {
                        if (session != null) {
                            runTasks(getSessionTasksQueue(session));
                        }
                    } finally {
                        idleWorkers.incrementAndGet();
                    }
                }


IoSession session = fetchSession();  拿到session
  runTasks(getSessionTasksQueue(session));  运行session对应queue的任务

 private void runTasks(SessionTasksQueue sessionTasksQueue) {
            for (;;) {
                Runnable task;
                Queue<Runnable> tasksQueue = sessionTasksQueue.tasksQueue;
                
                synchronized (tasksQueue) {
                    task = tasksQueue.poll();
                    
                    if (task == null) {
                        sessionTasksQueue.processingCompleted = true;
                        break;
                    }
                }

                eventQueueHandler.polled(OrderedThreadPoolExecutor.this, (IoEvent) task);

                runTask(task);
            }
        }


synchronized (tasksQueue)  可以看到执行任务的时候是锁住sesssion的queue的,这个时候是不能添加任务的,所以可以保证同一个queue的任务是在同一个线程执行的,
(ps:worker 可以理解为一个线程)
0
0
分享到:
评论

相关推荐

    Mina实现长连接和短连接实例

    当客户端发起连接请求时,服务器端的`Acceptor`会创建一个新的`Session`对象,然后将其绑定到对应的`SessionHandler`上。在`SessionHandler`中,我们可以设置心跳机制来检测连接是否活跃,防止因网络问题导致的连接...

    spring+mina实现http接口服务端通信客户端

    Mina的IoHandler接口需要实现,用于处理接收到的网络事件。 4. **编写IoHandler**:IoHandler是Mina的核心组件,负责处理网络连接的建立、数据的读写以及连接的关闭等事件。在这个项目中,IoHandler应该能够解析从...

    Mina实现RPC的例子

    在服务端,接收到请求后,调用对应的服务实现方法,然后将结果返回给客户端。 通过上述步骤,我们可以构建一个基于Mina的RPC系统。这个例子中的链接...

    MINA长连接框架实现通讯

    2. **MINA Server端实现**:在MINA中,Server端主要负责监听指定的端口,接收到客户端连接请求后,创建一个Session对象来代表与该客户端的连接。Server端可以通过自定义的Filter(过滤器)来处理进来的数据,如解码...

    mina连接 mina心跳连接 mina断线重连

    Apache Mina是一个开源的网络通信框架,常用于构建高性能、高效率的服务端应用程序,尤其在Java平台上。在本文中,我们将深入探讨Mina的核心概念,包括连接管理、心跳机制以及断线重连策略。 首先,让我们理解"Mina...

    mina实现多人聊天工程源码

    在接收到连接请求后,会创建一个新的Session,并添加一系列的过滤器。服务器还需要处理Session的打开、关闭、异常等事件,以及通过Session进行数据传输。 2. Client端:客户端可能使用Flash或其他技术实现,与...

    基于Apache Mina实现的TCP长连接和短连接实例

    ### 基于Apache Mina实现的TCP长连接和短连接实例 #### 一、引言 Apache Mina是Apache组织推出的一款优秀的网络应用程序框架,它的全称是Multipurpose Infrastructure for Network Applications(多用途网络应用...

    MINA 服务端和客户端demo

    - MINA服务端的核心组件是Acceptor,它负责监听指定的端口,当有新的客户端连接请求时,Acceptor会创建一个新的Session来处理这个连接。 - Session是MINA中的关键概念,代表一个与客户端的连接。它包含了与连接...

    Mina客户端服务器Demo

    过滤器可以对数据进行预处理、后处理,实现如日志记录、性能监控等功能。 在**Mina客户端服务器Demo**中,你可以看到以下关键部分: - **服务器端**:首先,服务器会创建一个Acceptor,监听指定端口的连接请求。...

    基于Mina的Http Server以及简单的Http请求客户端

    5. **关闭连接**:处理完请求后,记得关闭连接以释放资源。 通过以上步骤,你就可以使用Apache Mina构建一个基本的HTTP服务器和客户端。当然,实际应用中可能需要处理更复杂的场景,比如并发连接管理、SSL/TLS加密...

    Apache mina2学习笔记DEMO

    当连接建立后,客户端可以通过Session发送数据到服务器,并接收服务器的响应。 在这个DEMO中,我们还可以期待看到如何处理MINA的事件模型。MINA使用I/O事件驱动模型,常见的事件有连接建立(sessionCreated)、数据...

    mina2 cs 客户端服务器通信 已经实现完整通信代码

    - 实现IoHandler接口,定义服务器接收到消息后的处理逻辑。 - 启动Acceptor,开始监听客户端连接。 2. **创建客户端**: - 初始化Connector,指定要连接的服务器地址和端口。 - 设置IoHandler,定义客户端发送...

    Mina Socket 源代码

    当客户端连接建立后,Mina 将自动创建一个新的 Session 对象。 6. **Client 端实现** 在 `socket_client` 文件夹中,源代码将展示如何建立到 Mina 服务器的连接。客户端同样需要配置过滤器链和协议处理器,然后...

    基于spring的Mina框架

    Filter链模式使得我们可以添加自定义的处理逻辑,对进出门数据进行预处理或后处理。 **2. Spring与Mina的整合** 在Spring中整合Mina,首先需要在Spring配置文件中声明Mina的相关bean,如Acceptor、...

    Mina开发实例(服务端、客户端)DEMO

    在Java世界中,Mina以其简洁的API和灵活性而受到青睐,尤其适用于处理大量的并发连接,如TCP/IP和UDP协议。在这个"Mina开发实例(服务端、客户端)DEMO"中,我们将深入探讨Mina如何实现长连接通讯。 首先,我们来...

    MINA 服务器端实现 可运行

    1. **异步事件驱动**:MINA采用非阻塞I/O模型,即NIO(New IO)模式,通过Selector监听多个通道(Channel)的事件,如连接请求、数据读写等,提高了服务端处理大量并发连接的能力。 2. **生命周期管理**:MINA提供...

    mina及时推送客户端服务端实现

    4. **服务端实现**:服务端同样基于MINA,通过ServerBootstrap配置Acceptor,监听端口,接收到客户端连接请求后,创建Session。服务端可以注册监听器来处理客户端的连接、断开、数据到达等事件,实现推送服务的逻辑...

    Mina文件及字符串传输

    服务端接收到连接请求后,会创建一个对应的Session实例。当接收到数据时,Mina会调用预先设置的事件处理器(通常是IoHandler)来处理接收到的字符串。在这里,我们可以解析这个字符串,执行相应的业务逻辑,比如根据...

    mina2 实例程序(socket通讯调用远程方法)

    《mina2实现Socket通信调用远程方法详解》 在当今的分布式系统中,远程方法调用(Remote Method Invocation,RMI)是常见的通信方式之一,它允许程序在不同的网络节点间透明地调用方法,极大地简化了分布式应用的...

Global site tag (gtag.js) - Google Analytics