0
votes

I have a process that uses RestTemplate to call getForObject. This task is submitted to an executor service. I allow the process x seconds of run time before attempting to cancel it. However when I call Future.cancel(true) and the task is waiting in the getForObject method, the thread / task is not cancelled.

I have tested the code such that if I put a Thread.sleep in place of the getForObject I get an InterruptedException. However, when the task is inside getForObject not interruption occurrs. In face the method does not return until the Restful invocation is complete.

Is there a way to cancel the rest call?

I saw this post cancel abort interrupt a spring android resttemplate request but the only proposed solution seems to be a kludge.

1
I am also using RestTemplate in my project. How did you end up solving this problem? Since I don't see authors of RestTemplate provided this capability as of now. I am also calling cancel on my future but RestTemplate doesn't throw InterruptedException at all. - john
Hi John, just wanted to follow up with you on this again. - john
@david we didn't find a good solution. Currently we just wait for the rest call to time out on its own. We have also set the connection and read timeouts to shorter values. - John B

1 Answers

0
votes

I'm not familiar with the RestTemplate class, but it sound like you have a non-interruptable blocking call. This means that canceling the future or interrupting the thread won't have any effect. The only solution that I know of in this case is to use the deprecated Thread.terminate() method to kill the thread. Please note that you have to be VERY careful doing this because it can leave your object in an invalid state.