J'ai été confronté à un problème similaire où ma tâche était de pousser un message vers SQS dans un délai particulier. J'ai utilisé la logique triviale de l'exécuter via un autre thread et d'attendre son objet futur en spécifiant le délai. Cela me donnerait une exception TIMEOUT en cas de dépassement de délai.
final Future<ISendMessageResult> future =
timeoutHelperThreadPool.getExecutor().submit(() -> {
return getQueueStore().sendMessage(request).get();
});
try {
sendMessageResult = future.get(200, TimeUnit.MILLISECONDS);
logger.info("SQS_PUSH_SUCCESSFUL");
return true;
} catch (final TimeoutException e) {
logger.error("SQS_PUSH_TIMEOUT_EXCEPTION");
}
Mais il y a des cas où vous ne pouvez pas empêcher le code d'être exécuté par un autre thread et vous obtenez des vrais négatifs dans ce cas.
Par exemple - Dans mon cas, ma demande a atteint SQS et pendant que le message était poussé, ma logique de code a rencontré le timeout spécifié. En réalité, mon message a été poussé dans la file d'attente, mais mon thread principal a supposé qu'il avait échoué en raison de l'exception TIMEOUT. C'est un type de problème qui peut être évité plutôt que résolu. Dans mon cas, je l'ai évité en fournissant un délai d'attente qui suffirait dans presque tous les cas.
Si le code que vous voulez interrompre se trouve à l'intérieur de votre application et n'est pas un appel d'API, alors vous pouvez simplement utiliser
future.cancel(true)
Cependant, n'oubliez pas que la documentation de Java indique qu'elle ne garantit pas que l'exécution sera bloquée.
"Tente d'annuler l'exécution de cette tâche. Cette tentative échoue si la tâche est déjà terminée, si elle a déjà été annulée ou si elle n'a pas pu être annulée pour une autre raison. En cas de succès, et si cette tâche n'a pas encore commencé au moment de l'appel de l'annulation, cette tâche ne devrait jamais s'exécuter. Si la tâche a déjà commencé, le paramètre mayInterruptIfRunning détermine si le fil d'exécution de cette tâche doit être interrompu pour tenter d'arrêter la tâche."