mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-17 10:25:15 +00:00
Add runAfter and notifyOnce wrapper to ActionListener (#37331)
Relates #37291
This commit is contained in:
parent
9f3da013d8
commit
360c430ad7
@ -136,4 +136,48 @@ public interface ActionListener<Response> {
|
|||||||
}
|
}
|
||||||
ExceptionsHelper.maybeThrowRuntimeAndSuppress(exceptionList);
|
ExceptionsHelper.maybeThrowRuntimeAndSuppress(exceptionList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps a given listener and returns a new listener which executes the provided {@code runAfter}
|
||||||
|
* callback when the listener is notified via either {@code #onResponse} or {@code #onFailure}.
|
||||||
|
*/
|
||||||
|
static <Response> ActionListener<Response> runAfter(ActionListener<Response> delegate, Runnable runAfter) {
|
||||||
|
return new ActionListener<Response>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(Response response) {
|
||||||
|
try {
|
||||||
|
delegate.onResponse(response);
|
||||||
|
} finally {
|
||||||
|
runAfter.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFailure(Exception e) {
|
||||||
|
try {
|
||||||
|
delegate.onFailure(e);
|
||||||
|
} finally {
|
||||||
|
runAfter.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wraps a given listener and returns a new listener which makes sure {@link #onResponse(Object)}
|
||||||
|
* and {@link #onFailure(Exception)} of the provided listener will be called at most once.
|
||||||
|
*/
|
||||||
|
static <Response> ActionListener<Response> notifyOnce(ActionListener<Response> delegate) {
|
||||||
|
return new NotifyOnceListener<Response>() {
|
||||||
|
@Override
|
||||||
|
protected void innerOnResponse(Response response) {
|
||||||
|
delegate.onResponse(response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void innerOnFailure(Exception e) {
|
||||||
|
delegate.onFailure(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,9 +23,12 @@ import org.elasticsearch.test.ESTestCase;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
|
||||||
public class ActionListenerTests extends ESTestCase {
|
public class ActionListenerTests extends ESTestCase {
|
||||||
|
|
||||||
public void testWrap() {
|
public void testWrap() {
|
||||||
@ -148,4 +151,54 @@ public class ActionListenerTests extends ESTestCase {
|
|||||||
assertEquals("listener index " + i, "booom", excList.get(i).get().getMessage());
|
assertEquals("listener index " + i, "booom", excList.get(i).get().getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testRunAfter() {
|
||||||
|
{
|
||||||
|
AtomicBoolean afterSuccess = new AtomicBoolean();
|
||||||
|
ActionListener<Object> listener = ActionListener.runAfter(ActionListener.wrap(r -> {}, e -> {}), () -> afterSuccess.set(true));
|
||||||
|
listener.onResponse(null);
|
||||||
|
assertThat(afterSuccess.get(), equalTo(true));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
AtomicBoolean afterFailure = new AtomicBoolean();
|
||||||
|
ActionListener<Object> listener = ActionListener.runAfter(ActionListener.wrap(r -> {}, e -> {}), () -> afterFailure.set(true));
|
||||||
|
listener.onFailure(null);
|
||||||
|
assertThat(afterFailure.get(), equalTo(true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNotifyOnce() {
|
||||||
|
AtomicInteger onResponseTimes = new AtomicInteger();
|
||||||
|
AtomicInteger onFailureTimes = new AtomicInteger();
|
||||||
|
ActionListener<Object> listener = ActionListener.notifyOnce(new ActionListener<Object>() {
|
||||||
|
@Override
|
||||||
|
public void onResponse(Object o) {
|
||||||
|
onResponseTimes.getAndIncrement();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onFailure(Exception e) {
|
||||||
|
onFailureTimes.getAndIncrement();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
boolean success = randomBoolean();
|
||||||
|
if (success) {
|
||||||
|
listener.onResponse(null);
|
||||||
|
} else {
|
||||||
|
listener.onFailure(new RuntimeException("test"));
|
||||||
|
}
|
||||||
|
for (int iters = between(0, 10), i = 0; i < iters; i++) {
|
||||||
|
if (randomBoolean()) {
|
||||||
|
listener.onResponse(null);
|
||||||
|
} else {
|
||||||
|
listener.onFailure(new RuntimeException("test"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (success) {
|
||||||
|
assertThat(onResponseTimes.get(), equalTo(1));
|
||||||
|
assertThat(onFailureTimes.get(), equalTo(0));
|
||||||
|
} else {
|
||||||
|
assertThat(onResponseTimes.get(), equalTo(0));
|
||||||
|
assertThat(onFailureTimes.get(), equalTo(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user