Skip to content

Commit f681fb0

Browse files
authored
Merge pull request #179 from snorwin/await-termination-timeout
Added parameter to set await termination timeout
2 parents 4b7f686 + 427bca6 commit f681fb0

File tree

6 files changed

+49
-4
lines changed

6 files changed

+49
-4
lines changed

src/main/java/com/splunk/logging/HttpEventCollectorLog4jAppender.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public static HttpEventCollectorLog4jAppender createAppender(
157157
@PluginAttribute(value = "call_timeout", defaultLong = HttpEventCollectorSender.TimeoutSettings.DEFAULT_CALL_TIMEOUT) final long callTimeout,
158158
@PluginAttribute(value = "read_timeout", defaultLong = HttpEventCollectorSender.TimeoutSettings.DEFAULT_READ_TIMEOUT) final long readTimeout,
159159
@PluginAttribute(value = "write_timeout", defaultLong = HttpEventCollectorSender.TimeoutSettings.DEFAULT_WRITE_TIMEOUT) final long writeTimeout,
160+
@PluginAttribute(value = "termination_timeout", defaultLong = HttpEventCollectorSender.TimeoutSettings.DEFAULT_TERMINATION_TIMEOUT) final long terminationTimeout,
160161
@PluginElement("Layout") Layout<? extends Serializable> layout,
161162
@PluginElement("Filter") final Filter filter
162163
)
@@ -219,7 +220,7 @@ public static HttpEventCollectorLog4jAppender createAppender(
219220
disableCertificateValidation,
220221
eventBodySerializer,
221222
eventHeaderSerializer,
222-
new HttpEventCollectorSender.TimeoutSettings(connectTimeout, callTimeout, readTimeout, writeTimeout)
223+
new HttpEventCollectorSender.TimeoutSettings(connectTimeout, callTimeout, readTimeout, writeTimeout, terminationTimeout)
223224
);
224225
}
225226

src/main/java/com/splunk/logging/HttpEventCollectorLogbackAppender.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,14 @@ public long getWriteTimeout(long milliseconds) {
384384
return this.timeoutSettings.writeTimeout = milliseconds;
385385
}
386386

387+
public void setTerminationTimeout(long milliseconds) {
388+
this.timeoutSettings.terminationTimeout = milliseconds;
389+
}
390+
391+
public long getTerminationTimeout(long milliseconds) {
392+
return this.timeoutSettings.terminationTimeout = milliseconds;
393+
}
394+
387395
private static long parseLong(String string, int defaultValue) {
388396
try {
389397
return Long.parseLong(string);

src/main/java/com/splunk/logging/HttpEventCollectorLoggingHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public final class HttpEventCollectorLoggingHandler extends Handler {
114114
private final String CallTimeoutConfTag = "call_timeout";
115115
private final String ReadTimeoutConfTag = "read_timeout";
116116
private final String WriteTimeoutConfTag = "write_timeout";
117+
private final String TerminationTimeoutConfTag = "termination_timeout";
117118

118119
/** HttpEventCollectorLoggingHandler c-or */
119120
public HttpEventCollectorLoggingHandler() {
@@ -165,7 +166,8 @@ public HttpEventCollectorLoggingHandler() {
165166
getConfigurationNumericProperty(ConnectTimeoutConfTag, HttpEventCollectorSender.TimeoutSettings.DEFAULT_CONNECT_TIMEOUT),
166167
getConfigurationNumericProperty(CallTimeoutConfTag, HttpEventCollectorSender.TimeoutSettings.DEFAULT_CALL_TIMEOUT),
167168
getConfigurationNumericProperty(ReadTimeoutConfTag, HttpEventCollectorSender.TimeoutSettings.DEFAULT_READ_TIMEOUT),
168-
getConfigurationNumericProperty(WriteTimeoutConfTag, HttpEventCollectorSender.TimeoutSettings.DEFAULT_WRITE_TIMEOUT)
169+
getConfigurationNumericProperty(WriteTimeoutConfTag, HttpEventCollectorSender.TimeoutSettings.DEFAULT_WRITE_TIMEOUT),
170+
getConfigurationNumericProperty(TerminationTimeoutConfTag, HttpEventCollectorSender.TimeoutSettings.DEFAULT_TERMINATION_TIMEOUT)
169171
);
170172

171173
if ("raw".equalsIgnoreCase(type)) {

src/main/java/com/splunk/logging/HttpEventCollectorSender.java

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.io.Serializable;
3030
import java.security.cert.CertificateException;
3131
import java.util.*;
32+
import java.util.concurrent.TimeUnit;
3233
import java.util.stream.Collectors;
3334

3435

@@ -263,8 +264,36 @@ public static void putIfPresent(JsonObject collection, String tag, Object value)
263264

264265
private void stopHttpClient() {
265266
if (httpClient != null) {
266-
httpClient.dispatcher().executorService().shutdown();
267+
Dispatcher dispatcher = httpClient.dispatcher();
267268
httpClient = null;
269+
270+
if (timeoutSettings.terminationTimeout > 0) {
271+
// wait for queued messages in the dispatcher to be promoted to the executor service
272+
long start = System.currentTimeMillis();
273+
while (dispatcher.queuedCallsCount() > 0 && start + timeoutSettings.terminationTimeout > System.currentTimeMillis()) {
274+
try {
275+
TimeUnit.MILLISECONDS.sleep(10);
276+
} catch (InterruptedException e) {
277+
Thread.currentThread().interrupt();
278+
break;
279+
}
280+
}
281+
282+
// initialize the shutdown of the executor service
283+
dispatcher.executorService().shutdown();
284+
285+
// wait for the messages in the dispatcher's executor service to be sent out
286+
long awaitTerminationTimeout = timeoutSettings.terminationTimeout - (System.currentTimeMillis() - start);
287+
if (awaitTerminationTimeout > 0) {
288+
try {
289+
dispatcher.executorService().awaitTermination(awaitTerminationTimeout, TimeUnit.MILLISECONDS);
290+
} catch (InterruptedException e) {
291+
Thread.currentThread().interrupt();
292+
}
293+
}
294+
} else {
295+
dispatcher.executorService().shutdown();
296+
}
268297
}
269298
}
270299

@@ -393,19 +422,22 @@ public static class TimeoutSettings {
393422
public static final long DEFAULT_WRITE_TIMEOUT = 0; // 0 means no timeout
394423
public static final long DEFAULT_CALL_TIMEOUT = 0;
395424
public static final long DEFAULT_READ_TIMEOUT = 0;
425+
public static final long DEFAULT_TERMINATION_TIMEOUT = 0;
396426

397427
public long connectTimeout = DEFAULT_CONNECT_TIMEOUT;
398428
public long callTimeout = DEFAULT_CALL_TIMEOUT;
399429
public long readTimeout = DEFAULT_READ_TIMEOUT;
400430
public long writeTimeout = DEFAULT_WRITE_TIMEOUT;
431+
public long terminationTimeout = DEFAULT_TERMINATION_TIMEOUT;
401432

402433
public TimeoutSettings() {}
403434

404-
public TimeoutSettings(long connectTimeout, long callTimeout, long readTimeout, long writeTimeout) {
435+
public TimeoutSettings(long connectTimeout, long callTimeout, long readTimeout, long writeTimeout, long terminationTimeout) {
405436
this.connectTimeout = connectTimeout;
406437
this.callTimeout = callTimeout;
407438
this.readTimeout = readTimeout;
408439
this.writeTimeout = writeTimeout;
440+
this.terminationTimeout = terminationTimeout;
409441
}
410442
}
411443
}

src/test/resources/log4j2.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ under the License.
4545
batch_size_count="0"
4646
batch_interval="0"
4747
connect_timeout="5000"
48+
termination_timeout="1000"
4849
disableCertificateValidation="true">
4950
<PatternLayout pattern="%m"/>
5051
</SplunkHttp>

src/test/resources/logback.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ under the License.
6060
<messageFormat>text</messageFormat>
6161
<middleware>HttpEventCollectorUnitTestMiddleware</middleware>
6262
<connectTimeout>5000</connectTimeout>
63+
<terminationTieout>2000</terminationTieout>
6364
<layout class="ch.qos.logback.classic.PatternLayout">
6465
<pattern>%msg</pattern>
6566
</layout>

0 commit comments

Comments
 (0)