hi :
I have a client socket application using mina , and I want get the message
sent order in one session.
The ProtocolCodecFilter.filterWrite will flush once more . The first
flushing offer a EncodedWriteRequest into the session's writeRequestQueue
, the second flushing offer the MessageWriteRequest into the session's
writeRequestQueu.
I want put the message into a queue , after the encoded message is sent in
the NioProcessor's worker thread . But the first EncodedWriteRequest
hasn't writefuture , so I can't using IoFutureListener<WriteFuture> ; and
even if I implement the IoFilterAdaptor's messageSent , can get the
encodedMessage not the message.
So I have to keep a map from encodedMessage to message .
public class CommandEncoder extends ProtocolEncoderAdapter {
public void encode(IoSession session, Object message,
ProtocolEncoderOutput out) throws Exception {
CommandQueueItem item = (CommandQueueItem) message;
IoBuffer buf =
item.getCommand().toBuf(MemcachedConstants.DEFAULT_CHARSET);
buf.setAutoExpand(true);
buf.flip();
ConcurrentHashMap<IoBuffer , CommandQueueItem> map=
(ConcurrentHashMap<IoBuffer,CommandQueueItem>)session.getAttribute("encodedMessage2Message");
map.put(buf, item);
out.write(buf);
}
}
public class AppendFilter extends IoFilterAdapter {
@SuppressWarnings("unchecked")
@Override
public void messageSent(NextFilter nextFilter, IoSession session,
WriteRequest writeRequest) throws Exception {
Object obj = writeRequest.getMessage();
if( obj instanceof IoBuffer )
{
IoBuffer buf = (IoBuffer) obj;
ConcurrentHashMap<IoBuffer , CommandQueueItem >
encodedMessage2Message =
(ConcurrentHashMap<IoBuffer, CommandQueueItem>)
session.getAttribute("encodedMessage2Message");
CommandQueueItem item = encodedMessage2Message.get(buf);
// ignore
}
nextFilter.messageSent(session , writeRequest);
}
}
It's so ugly , can anyone give me a better way ? 3x