Java tutorial
/** * Copyright (C) 2010-2013 Alibaba Group Holding Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.rocketmq.broker.pagecache; import io.netty.channel.FileRegion; import io.netty.util.AbstractReferenceCounted; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.WritableByteChannel; import java.util.List; import com.alibaba.rocketmq.store.QueryMessageResult; /** * @author shijia.wxr<vintage.wang@gmail.com> * @since 2013-7-26 */ public class QueryMessageTransfer extends AbstractReferenceCounted implements FileRegion { private final ByteBuffer byteBufferHeader; private final QueryMessageResult queryMessageResult; private long transfered; // the bytes which was transfered already public QueryMessageTransfer(ByteBuffer byteBufferHeader, QueryMessageResult queryMessageResult) { this.byteBufferHeader = byteBufferHeader; this.queryMessageResult = queryMessageResult; } @Override public long position() { int pos = byteBufferHeader.position(); List<ByteBuffer> messageBufferList = this.queryMessageResult.getMessageBufferList(); for (ByteBuffer bb : messageBufferList) { pos += bb.position(); } return pos; } @Override public long count() { return byteBufferHeader.limit() + this.queryMessageResult.getBufferTotalSize(); } @Override public long transferTo(WritableByteChannel target, long position) throws IOException { if (this.byteBufferHeader.hasRemaining()) { transfered += target.write(this.byteBufferHeader); return transfered; } else { List<ByteBuffer> messageBufferList = this.queryMessageResult.getMessageBufferList(); for (ByteBuffer bb : messageBufferList) { if (bb.hasRemaining()) { transfered += target.write(bb); return transfered; } } } return 0; } public void close() { this.deallocate(); } @Override protected void deallocate() { this.queryMessageResult.release(); } @Override public long transfered() { return transfered; } @Override public FileRegion retain() { super.retain(); return this; } @Override public FileRegion retain(int increment) { super.retain(increment); return this; } public FileRegion touch() { return this; } public FileRegion touch(Object hint) { return this; } }