Skip to content

Commit 26d5542

Browse files
committed
running listener code in separate thread
1 parent f3fbf3c commit 26d5542

File tree

1 file changed

+22
-7
lines changed
  • java-client/src/main/java/co/elastic/clients/elasticsearch/_helpers/bulk

1 file changed

+22
-7
lines changed

java-client/src/main/java/co/elastic/clients/elasticsearch/_helpers/bulk/BulkIngester.java

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.Collections;
3737
import java.util.List;
3838
import java.util.concurrent.CompletionStage;
39+
import java.util.concurrent.ExecutorService;
3940
import java.util.concurrent.Executors;
4041
import java.util.concurrent.ScheduledExecutorService;
4142
import java.util.concurrent.ScheduledFuture;
@@ -58,10 +59,11 @@ public class BulkIngester<Context> implements AutoCloseable {
5859
private final long maxSize;
5960
private final int maxOperations;
6061
private final @Nullable BulkListener<Context> listener;
62+
private ExecutorService listenerExecutor = null; // Created only if listener is present
6163
private final Long flushIntervalMillis;
6264

6365
private @Nullable ScheduledFuture<?> flushTask;
64-
private @Nullable ScheduledExecutorService scheduler;
66+
private @Nullable ScheduledExecutorService flushScheduler;
6567

6668
// Current state
6769
private List<BulkOperation> operations = new ArrayList<>();
@@ -98,6 +100,14 @@ private BulkIngester(Builder<Context> builder) {
98100
this.maxSize = builder.bulkSize < 0 ? Long.MAX_VALUE : builder.bulkSize;
99101
this.maxOperations = builder.bulkOperations < 0 ? Integer.MAX_VALUE : builder.bulkOperations;
100102
this.listener = builder.listener;
103+
if(listener != null) {
104+
this.listenerExecutor = Executors.newSingleThreadScheduledExecutor((r) -> {
105+
Thread t = Executors.defaultThreadFactory().newThread(r);
106+
t.setName("listener-executor#" + ingesterId);
107+
t.setDaemon(true);
108+
return t;
109+
});
110+
}
101111
this.flushIntervalMillis = builder.flushIntervalMillis;
102112

103113
if (flushIntervalMillis != null) {
@@ -114,7 +124,7 @@ private BulkIngester(Builder<Context> builder) {
114124
});
115125

116126
// Keep it, we'll have to close it.
117-
this.scheduler = scheduler;
127+
this.flushScheduler = scheduler;
118128
} else {
119129
// It's not ours, we will not close it.
120130
scheduler = builder.scheduler;
@@ -291,7 +301,8 @@ public void flush() {
291301
long id = sendRequestCondition.invocations();
292302

293303
if (listener != null) {
294-
listener.beforeBulk(id, request, requestContexts);
304+
BulkRequest finalRequest = request;
305+
listenerExecutor.submit(() -> listener.beforeBulk(id, finalRequest, requestContexts));
295306
}
296307

297308
CompletionStage<BulkResponse> result = client.bulk(request);
@@ -317,12 +328,12 @@ public void flush() {
317328
if (resp != null) {
318329
// Success
319330
if (listener != null) {
320-
listener.afterBulk(exec.id, exec.request, exec.contexts, resp);
331+
listenerExecutor.submit(() -> listener.afterBulk(exec.id, exec.request, exec.contexts, resp));
321332
}
322333
} else {
323334
// Failure
324335
if (listener != null) {
325-
listener.afterBulk(exec.id, exec.request, exec.contexts, thr);
336+
listenerExecutor.submit(() -> listener.afterBulk(exec.id, exec.request, exec.contexts, thr));
326337
}
327338
}
328339
return null;
@@ -389,8 +400,12 @@ public void close() {
389400
flushTask.cancel(false);
390401
}
391402

392-
if (scheduler != null) {
393-
scheduler.shutdownNow();
403+
if (flushScheduler != null) {
404+
flushScheduler.shutdownNow();
405+
}
406+
407+
if (listenerExecutor != null){
408+
listenerExecutor.shutdownNow();
394409
}
395410
}
396411

0 commit comments

Comments
 (0)