我正在使用Oracle Jersey Client
,我正在尝试取消长时间运行的get
或put
操作。
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
。
答案 0 :(得分:0)
我想知道是否有更好的解决方案(可能是在创建客户端时)正确处理可中断的I / O而不使用RuntimeException。
是的,中断线程只有在代码正在监视中断或调用其他方法(例如Thread.sleep(...)
)时才会有效。
从听众中抛出异常听起来不是一个坏主意。我当然会创建你自己的RuntimeException
类,例如TimeoutRuntimeException
或类似的东西,这样你就可以专门捕获并处理它。
要做的另一件事是关闭正在写入的基础IO流,这将导致IOException
,但我不熟悉泽西岛,所以我不确定你是否可以获得对连接的访问权。
File
,如何在BufferedInputStream
上读取File
,但也有超时。所以Jersey会从缓冲区中读取,如果超时到期,它会在某个时刻抛出IOException
。