Cancel / abort / interrupt a spring-android resttemplate request

丶灬走出姿态 提交于 2019-12-22 10:26:45

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!