本文主要是介绍Apache mina: IoSession.write(Object msg)剖析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在apache mina中通过IoSession 写入数据,返回一个Future可以获取写入数据的结果。
NioSocketSession(AbstractIoSession).write(Object)
NioSocketSession(AbstractIoSession).write(Object, SocketAddress) .IoSession通过FilterChain 过滤链写出数据。
// Now, we can write the message. First, create a futureWriteFuture writeFuture = new DefaultWriteFuture(this);WriteRequest writeRequest = new DefaultWriteRequest(message, writeFuture, remoteAddress);// Then, get the chain and inject the WriteRequest into itIoFilterChain filterChain = getFilterChain();filterChain.fireFilterWrite(writeRequest);
DefaultIoFilterChain.callPreviousFilterWrite(IoFilterChain$Entry, IoSession, WriteRequest)
ProtocolCodecFilter.filterWrite(IoFilter$NextFilter, IoSession, WriteRequest)
在ProtocolCodecFilter 中把Object消息编码后,到达HeadFilter中。在HeadFilter中负责把消息写入消息队列中。
private class HeadFilter extends IoFilterAdapter {@SuppressWarnings("unchecked")@Overridepublic void filterWrite(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {AbstractIoSession s = (AbstractIoSession) session;// Maintain counters.if (writeRequest.getMessage() instanceof IoBuffer) {IoBuffer buffer = (IoBuffer) writeRequest.getMessage();// I/O processor implementation will call buffer.reset()// it after the write operation is finished, because// the buffer will be specified with messageSent event.buffer.mark();int remaining = buffer.remaining();if (remaining > 0) {s.increaseScheduledWriteBytes(remaining);}} else {s.increaseScheduledWriteMessages();}//在HeadFilter中把要写入的消息放在WriteRequestQueueWriteRequestQueue writeRequestQueue = s.getWriteRequestQueue();if (!s.isWriteSuspended()) {if (writeRequestQueue.isEmpty(session)) {
这篇关于Apache mina: IoSession.write(Object msg)剖析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!