首页 > 解决方案 > java中的SocketTimeOut异常,同时调用RestTemplate GetforObject

问题描述

我们遇到以下错误模式:

“ https://samplepath ”的 GET 请求的 I/O 错误:获取 URL 时超时:https://samplepath;嵌套异常是 java.net.SocketTimeoutException: Timeout while fetching URL: samplepath

代码:

    RestTemplate restTemplate = new RestTemplate();
    try {
        URI uri = new URI("https://samplepath);
        sessionInfo = restTemplate.getForObject(uri, SessionResponse.class);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }

此代码编写在 javax.servlet.Filter 中,所有请求都将迁移到此代码块,在此代码块中它将在内部调用另一个 api

问题是在我在 GAE 中部署并发请求获得命中后,一些请求将得到响应,而一些请求失败或抛出套接字超时异常,方法是通过 resttemplate 进行内部一次 Api 调用

对此问题的任何解决方案将不胜感激,谢谢,,

@Component
public class FirstFilter implements Filter {
    public static Map<String, SessionResponse> sesssionDataCacheMap = Collections
            .synchronizedMap(new HashMap<String, SessionResponse>());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init() method has been get invoked");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        try {
            System.out.println("doFilter() method is invoked");
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            System.out.println("Context path is  " + httpServletRequest.getContextPath());

            String sidFromHeader = httpServletRequest.getHeader("sid");

            SessionResponse sessionInfo1 = null;
                        try {
                            sessionInfo1 = getSessionDataFromSessionId(sidFromHeader);
                            System.out.println("Session  present in cache");
                        } catch (Exception e) {
                            System.out.println(e.getMessage());
                        }
                        chain.doFilter(httpServletRequest, httpServletResponse);
                        System.out.println("doFilter() method is ended");
            }
    }
    @Override
    public void destroy() {
    System.out.println("destroy method is called");
    }

    private SessionResponse getSessionDataFromSessionId(String sessionId)  {

        SessionResponse sessionInfo = null;
        RestTemplate restTemplate = new RestTemplate();
        try {
            URI uri = new URI("https://samplesessionurl" + sessionId);
            sessionInfo = restTemplate.getForObject(uri, SessionResponse.class);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return sessionInfo;

    }

Appegine-web.xml 文件——

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <threadsafe>true</threadsafe>
        <runtime>java8</runtime>
        <system-properties>
            <property name="java.util.logging.config.file" value="WEB-INF/logging.properties" />
        </system-properties>
        <url-stream-handler>urlfetch</url-stream-handler>
        <warmup-requests-enabled>false</warmup-requests-enabled>
        <manual-scaling>
        <instances>1</instances>
      </manual-scaling>
    </appengine-web-app>

标签: javaspring-bootgoogle-app-enginefilterservlet-filters

解决方案


推荐阅读