did/did-sdk/src/main/java/io/github/ehlxr/did/client/ResponseFuture.java

96 lines
2.8 KiB
Java
Raw Normal View History

2021-01-22 07:40:02 +00:00
package io.github.ehlxr.did.client;
2018-08-14 07:21:56 +00:00
2021-01-22 07:40:02 +00:00
import io.github.ehlxr.did.common.SdkProto;
2018-08-14 07:21:56 +00:00
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author ehlxr
*/
public class ResponseFuture {
private final long timeoutMillis;
private final Semaphore semaphore;
private final InvokeCallback invokeCallback;
private final AtomicBoolean executeCallbackOnlyOnce = new AtomicBoolean(false);
private final AtomicBoolean semaphoreReleaseOnlyOnce = new AtomicBoolean(false);
private final CountDownLatch countDownLatch = new CountDownLatch(1);
private volatile Throwable cause;
private volatile SdkProto sdkProto;
2021-01-20 07:25:58 +00:00
public ResponseFuture(long timeoutMillis, InvokeCallback invokeCallback, Semaphore semaphore) {
2018-08-14 07:21:56 +00:00
this.timeoutMillis = timeoutMillis;
this.invokeCallback = invokeCallback;
this.semaphore = semaphore;
}
/**
*
*/
public void release() {
if (this.semaphore != null) {
if (semaphoreReleaseOnlyOnce.compareAndSet(false, true)) {
this.semaphore.release();
}
}
}
public void executeInvokeCallback() {
if (invokeCallback != null) {
if (executeCallbackOnlyOnce.compareAndSet(false, true)) {
invokeCallback.operationComplete(this);
}
}
}
public SdkProto waitResponse(final long timeoutMillis) throws InterruptedException {
this.countDownLatch.await(timeoutMillis, TimeUnit.MILLISECONDS);
return this.sdkProto;
}
/**
* CountDown
*/
public void putResponse(SdkProto sdkProto) {
this.sdkProto = sdkProto;
this.countDownLatch.countDown();
}
public InvokeCallback getInvokeCallback() {
return invokeCallback;
}
public SdkProto getSdkProto() {
return sdkProto;
}
public void setSdkProto(SdkProto sdkProto) {
this.sdkProto = sdkProto;
}
public Throwable getCause() {
return cause;
}
public void setCause(Throwable cause) {
this.cause = cause;
}
@Override
public String toString() {
return "ResponseFuture{" +
", timeoutMillis=" + timeoutMillis +
", semaphore=" + semaphore +
", invokeCallback=" + invokeCallback +
", executeCallbackOnlyOnce=" + executeCallbackOnlyOnce +
", semaphoreReleaseOnlyOnce=" + semaphoreReleaseOnlyOnce +
", countDownLatch=" + countDownLatch +
", cause=" + cause +
", sdkProto=" + sdkProto +
'}';
}
}