java - 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>
解决方案
推荐阅读
- android - 为什么我的应用没有填满整个屏幕?
- reactjs - 如何为所有 Material-UI 组件添加填充和边距?
- c++ - C++ 外部定义内联函数
- python - autopep8 不修复任何缩进
- firebase - Firebase 云功能 POST HTTPS 来自 ESP8266 的请求
- android - 由于缺少权限,无法加载 Android Facebook 登录
- python - 使用 Python 3 从 URL 中提取图像
- php - 通过 php 到 gmail 的 html 电子邮件与消息中的文本不兼容
- python-3.x - 如何小写python中每个新行的第一个字母?
- python - 如何将 2d 列表转换为 2d 本机 python 数组而不是 numpy 数组?