中断长时间运行的Jersey客户端操作

时间:2014-05-14 16:32:58

标签: java multithreading jersey httpconnection cancellation

我正在使用Oracle Jersey Client,我正在尝试取消长时间运行的getput操作。

Client构造为:

JacksonJsonProvider provider = new JacksonJsonProvider(new ObjectMapper());
ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getSingletons().add(provider);
Client client = Client.create(clientConfig);

以下代码在工作线程上执行:

File bigZipFile = new File("/home/me/everything.zip");

WebResource resource = client.resource("https://putfileshere.com");
Builder builder = resource.getRequestBuilder();

builder.type("application/zip").put(bigZipFile); //This will take a while!

我想取消这个长期运行的put。当我尝试中断工作线程时,put操作继续运行。从我所看到的情况来看,Jersey客户端不会尝试检查Thread.interrupted()

使用AsyncWebResource代替WebResource并在Future.cancel(true)电话上使用Builder.put(..)时,我看到相同的行为。

到目前为止,我提出的唯一解决办法就是在ContainerListener中抛出RuntimeException

client.addFilter(new ConnectionListenerFilter(
  new OnStartConnectionListener(){
    public ContainerListener onStart(ClientRequest cr) {
      return new ContainerListener(){
        public void onSent(long delta, long bytes) {

          //If the thread has been interrupted, stop the operation
          if (Thread.interrupted()) {
            throw new RuntimeException("Upload or Download canceled");
          }

          //Report progress otherwise

        }
      }...    

我想知道是否有更好的解决方案(可能在创建Client时)正确处理可中断的I / O而不使用RuntimeException

1 个答案:

答案 0 :(得分:0)

  

我想知道是否有更好的解决方案(可能是在创建客户端时)正确处理可中断的I / O而不使用RuntimeException。

是的,中断线程只有在代码正在监视中断或调用其他方法(例如Thread.sleep(...))时才会有效。

从听众中抛出异常听起来不是一个坏主意。我当然会创建你自己的RuntimeException类,例如TimeoutRuntimeException或类似的东西,这样你就可以专门捕获并处理它。

要做的另一件事是关闭正在写入的基础IO流,这将导致IOException,但我不熟悉泽西岛,所以我不确定你是否可以获得对连接的访问​​权。

啊,这是一个想法。而不是放File,如何在BufferedInputStream上读取File,但也有超时。所以Jersey会从缓冲区中读取,如果超时到期,它会在某个时刻抛出IOException