Java ConsoleApplication stops after calling the APIs after 60 seconds delay.
veryhungrycaterpillar opened this issue · 3 comments
Bug Report
Describe the bug
I made Java ConsoleApplication for send PushMessage using line-bot-sdk-java.
After Sending PushMessage, Java process didn't stop.
Java process stopped 1 minutes later after sending.
Java process stopped soon if not sending.
To Reproduce
I send PushMessage by following code.
public void send(List<PushMessage> pushMessages) {
if (pushMessages.isEmpty()) {
return;
}
LineMessagingClient client = LineMessagingClient
.builder(this.channelAccessToken)
.build();
for (PushMessage pushMessage : pushMessages) {
try {
BotApiResponse botApiResponse
= client.pushMessage(pushMessage).get();
} catch (InterruptedException | ExecutionException ex) {
throw new RuntimeException(ex);
}
}
}
Expected behavior
Java process stops soon after sending.
Environment (please complete the following information):
- OS: Windows10, CentOS 6.7 (64bit)
- JDK Version oracle jdk-8u92
- line-bot-sdk-java version(s) 4.3.0
Additional context
Does Response close in LineMessagingClientImpl?
https://github.com/line/line-bot-sdk-java/blob/master/line-bot-api-client/src/main/java/com/linecorp/bot/client/LineMessagingClientImpl.java
Retrofit added comment about close Response in 2020 May.
square/retrofit#3400
Thank you for your reporting. I can reproduce the issue.
Looks like it's due to retrofit's internal executor service is based on user thread (not daemon thread),
It's blocks JVM shutdown.
https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html
OkHttpClient closes threads after about 60 seconds of idling.
It's unexpected behaviour, but it's not a serious bug.
import com.linecorp.bot.client.LineMessagingClient;
import com.linecorp.bot.model.response.BotInfoResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyApplication {
private static final Logger log = LoggerFactory.getLogger(MyApplication.class);
public static void main(String[] args) throws Exception {
LineMessagingClient client = LineMessagingClient
.builder("< channelAccessToken >")
.build();
BotInfoResponse botInfoResponse = client.getBotInfo().get();
log.info("Got response: {}", botInfoResponse);
long finished = System.currentTimeMillis();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
log.info("Shutdown... after {} seconds delay",
(System.currentTimeMillis() - finished)/1000);
}));
}
}
18:57:46.242 [Thread-1] INFO MyApplication - Shutdown... after 60 seconds delay
line-bot-sdk-java should provide a way to call client.connectionPool().evictAll();
.
This is a spec.