问题
I use spring android in a thread dedicated to execute spring android requests.
I can't achieve to abort a request launched from spring android (a getForObject for instance).
I tried to :
- reach the underlying input stream to close but it is completely wrapped in springandroid restemplate and can't be accessed from outside
- interrupt the thread
- get the request factory of the rest template and call destroy
- get the connection manager of the factory and call shutdown
- change the rest template factory's http client
- change the rest template factory's request factory
but I can't abort a request and send a new one quickly. The first one has to reach its timeout.
How could I "kill" a spring android request a get a stable rest template to send a new request ?
Thanks in advance.
回答1:
I suggest using ResponseExtractor.
you can call execute method of RestTemplate such as below.
File file = (File) restTemplate.execute(rootUrl.concat("/vocasets/{vocasetId}/{version}"), HttpMethod.GET, requestCallabck,
responseExtractor, uriVariables);
ResponseExtractor has extractData method. you can take body inputstream from extractData method through getBody() of response.
Extend ResponseExtractor for canceling your request.
Good luck.
In my case, I've used Listener way.
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;
}
}
来源:https://stackoverflow.com/questions/12415554/cancel-abort-interrupt-a-spring-android-resttemplate-request