ChannelHandlerContext ctx,
MessageEvent e)
throws Exception {
// リクエストをバッファに変換して送信
Request request = (Request) e.getMessage();
RequestFuture future = new RequestFuture(request);
request.setFuture(future);
// チャネルを通して送信
try {
// バッファを確保
OutputBuffer outputBuffer = new BasicOutputBuffer();
BSONEncoder encoder = new BSONEncoder();
encoder.set(outputBuffer);
// リクエスト内容を出力
writeRequest(request, encoder, outputBuffer);
// Safeリクエストの場合は、 getLastError クエリを付加
Request getLastError = null;
BSONObject query = request.getConsistency().getLastErrorQuery();
if (query != null) {
getLastError = new Query(
request.getDatabaseName(),
"$cmd",
0,
1,
query,
null
);
getLastError.setFuture(future);
writeRequest(getLastError, encoder, outputBuffer);
}
// ChannelBuffer を生成
ChannelBuffer channelBuffer = ChannelBuffers.buffer(outputBuffer.size());
outputBuffer.pipe(new ChannelBufferOutputStream(channelBuffer));
// ChannelFuture を取得し RequestFuture に設定
ChannelFuture channelFuture = e.getFuture();
future.setChannelFuture(channelFuture);
// 送信リエクスト一覧に future を追加
OperationCode opCode = request.getHeader().getOpCode();
// safeモード、もしくは返信が見込める場合は、リクエストIDを設定
if (opCode.hasReply() || getLastError != null) {
if (getLastError == null) {
requestMap.put(future.getRequetId(), request);
request.setWaitingRequestId(request.getRequestId());
} else {
requestMap.put(getLastError.getRequestId(), request);
request.setWaitingRequestId(getLastError.getRequestId());
}
}
Channels.write(ctx, channelFuture, channelBuffer);
} catch (Exception ex) {