内容简介:本文主要研究一下Elasticsearch的Releasableselasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/lease/Releasable.javaelasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/lease/Releasables.java
序
本文主要研究一下Elasticsearch的Releasables
Releasable
elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/lease/Releasable.java
public interface Releasable extends Closeable {
@Override
void close();
}
- Releasable继承了java.io.Closeable接口
Releasables
elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/lease/Releasables.java
public enum Releasables {
;
private static void close(Iterable<? extends Releasable> releasables, boolean ignoreException) {
try {
// this does the right thing with respect to add suppressed and not wrapping errors etc.
IOUtils.close(releasables);
} catch (IOException e) {
if (ignoreException == false) {
throw new UncheckedIOException(e);
}
}
}
/** Release the provided {@link Releasable}s. */
public static void close(Iterable<? extends Releasable> releasables) {
close(releasables, false);
}
/** Release the provided {@link Releasable}s. */
public static void close(Releasable... releasables) {
close(Arrays.asList(releasables));
}
/** Release the provided {@link Releasable}s, ignoring exceptions. */
public static void closeWhileHandlingException(Iterable<Releasable> releasables) {
close(releasables, true);
}
/** Release the provided {@link Releasable}s, ignoring exceptions. */
public static void closeWhileHandlingException(Releasable... releasables) {
closeWhileHandlingException(Arrays.asList(releasables));
}
/** Release the provided {@link Releasable}s, ignoring exceptions if <code>success</code> is {@code false}. */
public static void close(boolean success, Iterable<Releasable> releasables) {
if (success) {
close(releasables);
} else {
closeWhileHandlingException(releasables);
}
}
/** Release the provided {@link Releasable}s, ignoring exceptions if <code>success</code> is {@code false}. */
public static void close(boolean success, Releasable... releasables) {
close(success, Arrays.asList(releasables));
}
/** Wrap several releasables into a single one. This is typically useful for use with try-with-resources: for example let's assume
* that you store in a list several resources that you would like to see released after execution of the try block:
*
* <pre>
* List<Releasable> resources = ...;
* try (Releasable releasable = Releasables.wrap(resources)) {
* // do something
* }
* // the resources will be released when reaching here
* </pre>
*/
public static Releasable wrap(final Iterable<Releasable> releasables) {
return () -> close(releasables);
}
/** @see #wrap(Iterable) */
public static Releasable wrap(final Releasable... releasables) {
return () -> close(releasables);
}
/**
* Equivalent to {@link #wrap(Releasable...)} but can be called multiple times without double releasing.
*/
public static Releasable releaseOnce(final Releasable... releasables) {
final AtomicBoolean released = new AtomicBoolean(false);
return () -> {
if (released.compareAndSet(false, true)) {
close(releasables);
}
};
}
}
- Releasables提供close、closeWhileHandlingException、wrap、releaseOnce静态方法用于更方便地使用Releasable
实例
elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/index/translog/Translog.java
public class Translog extends AbstractIndexShardComponent implements IndexShardComponent, Closeable {
//......
public static void writeOperations(StreamOutput outStream, List<Operation> toWrite) throws IOException {
final ReleasableBytesStreamOutput out = new ReleasableBytesStreamOutput(BigArrays.NON_RECYCLING_INSTANCE);
try {
outStream.writeInt(toWrite.size());
final BufferedChecksumStreamOutput checksumStreamOutput = new BufferedChecksumStreamOutput(out);
for (Operation op : toWrite) {
out.reset();
final long start = out.position();
out.skip(Integer.BYTES);
writeOperationNoSize(checksumStreamOutput, op);
long end = out.position();
int operationSize = (int) (out.position() - Integer.BYTES - start);
out.seek(start);
out.writeInt(operationSize);
out.seek(end);
ReleasablePagedBytesReference bytes = out.bytes();
bytes.writeTo(outStream);
}
} finally {
Releasables.close(out);
}
}
//......
}
- writeOperations在finally中使用Releasables.close关闭了ReleasableBytesStreamOutput
小结
Releasables提供close、closeWhileHandlingException、wrap、releaseOnce静态方法用于更方便地使用Releasable
doc
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Web Designer's Idea Book
Patrick Mcneil / How / 2008-10-6 / USD 25.00
The Web Designer's Idea Book includes more than 700 websites arranged thematically, so you can find inspiration for layout, color, style and more. Author Patrick McNeil has cataloged more than 5,000 s......一起来看看 《The Web Designer's Idea Book》 这本书的介绍吧!