gpt4 book ai didi

java - 取消/中止/中断 spring-android resttemplate 请求

转载 作者:太空狗 更新时间:2023-10-29 12:50:36 24 4
gpt4 key购买 nike

我在专用于执行 spring android 请求的线程中使用 spring android。

我无法中止从 spring android(例如 getForObject)发起的请求。

我试过:

  • 到达底层输入流关闭但它完全被springandroid restemplate包裹,无法从外部访问
  • 中断线程
  • 获取rest模板的request factory并调用destroy
  • 获取工厂的连接管理器并调用关闭
  • 更改其余模板工厂的http客户端
  • 更改其余模板工厂的请求工厂

但我无法中止请求并快速发送新请求。第一个必须达到超时。

我怎样才能“杀死”一个 spring android 请求并获得一个稳定的 rest 模板来发送一个新请求?

提前致谢。

最佳答案

我建议使用 ResponseExtractor。

你可以像下面这样调用 RestTemplate 的 execute 方法。

    File file = (File) restTemplate.execute(rootUrl.concat("/vocasets/{vocasetId}/{version}"), HttpMethod.GET, requestCallabck,
responseExtractor, uriVariables);

ResponseExtractor 有 extractData 方法。您可以通过响应的 getBody() 从 extractData 方法获取正文输入流。

扩展 ResponseExtractor 以取消您的请求。

祝你好运。

在我的例子中,我使用了 Listener 方式。

static class FileResponseExtractor implements ResponseExtractor<File> {
...

public void setListener(ReceivingListener listener) {
this.listener = listener;
}

@Override
public File extractData(ClientHttpResponse response) throws IOException {
InputStream is = response.getBody();

long contentLength = response.getHeaders().getContentLength();

long availableSpace = AvailableSpaceHandler.getExternalAvailableSpaceInMB();
long availableBytes = AvailableSpaceHandler.getExternalAvailableSpaceInBytes();
Log.d(TAG, "available space: " + availableSpace + " MB");

long spareSize = 1024 * 1024 * 100;
if(availableBytes < contentLength + spareSize) {
throw new NotEnoughWritableMemoryException(availableSpace);
}

File f = new File(temporaryFileName);
if (f.exists())
f.delete();
f.createNewFile();

OutputStream o = new FileOutputStream(f);

listener.onStart(contentLength, null);
boolean cancel = false;
try {
byte buf[] = new byte[bufferSize];
int len;
long sum = 0;
while ((len = is.read(buf)) > 0) {
o.write(buf, 0, len);
sum += len;
listener.onReceiving(sum, len, null);

cancel = !listener.onContinue();
if(cancel) {
Log.d(TAG, "Cancelled!!!");
throw new CancellationException();
}
}
} finally {
o.close();
is.close();
listener.onFinish(null);

if(cancel) {
f.delete();
}
}

return f;

}

}

关于java - 取消/中止/中断 spring-android resttemplate 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12415554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com