如何避免这种宁静的服务请求错误?

时间:2018-09-28 04:22:59

标签: java rest url

我有一个Spring Web项目,该项目通过URL提供了一个宁静的服务,该服务托管在本地计算机上进行测试。

http://localhost:8090/classify?classificationInput={"inputInfo":{"inputText":"how much money","sku":"2"}}

然后,我有一个平稳的客户端将请求发送到上面的服务,并以Json字符串的形式返回结果。问题是,如果我使用多线程将许多请求发送到静态服务,我将得到部分请求处理失败,如下所示。这是因为我的Web应用程序正在将请求发送到另一个静态服务来处理数据,并且由于需要花费一些时间来处理每个请求,所以它在某些请求上失败并发出以下异常(一个典型的异常):

ERROR com.nlu.qe.service.executors.Parser [107] [executeParser] - Parser 
IOException failed! 1887628

那是怎么回事

http://XX.XX.69.251/LexicalAnalyze?Type=graphjson&Key=Lsdif238fj&action=headdown&Sentence= message

给出此异常的代码如下:

private String executeParser(String sku, String inputText, String msgId) {

    String jsonOutput = null;
    String urlStr = "http://XX.XX.69.251/LexicalAnalyze?Type=graphjson&Key=Lsdif238fj&action=headdown&Sentence=";
    try {
        String encodedInputText = URLEncoder.encode("\"" + inputText + "\"", "UTF-8");
        URL url = new URL(urlStr + encodedInputText);
        BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
        jsonOutput = in.readLine();
        in.close();
        LOGGER.info("{} is parsed by {} {} {}", sku, urlStr, msgId, inputText);
    } catch (UnsupportedEncodingException e) {
        LOGGER.error("Parser UnsupportedEncodingException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
        e.printStackTrace();
    } catch (MalformedURLException e) {
        LOGGER.error("Parser MalformedURLException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
        e.printStackTrace();
    } catch (IOException e) {
        LOGGER.error("Parser IOException failed! {} {} {} {}", sku, inputText, urlStr, msgId);
        e.printStackTrace();
    }
    return jsonOutput;
}

我的猜测是,当由于多线程而产生的大量请求发送到静态服务时,该服务(如上面的代码所示)太忙而无法处理所有请求,因此某些请求失败。特别是,这部分失败了:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

这是真正的原因吗?如果是,怎么避免呢?我想使用多个线程来加快该过程。

编辑:

java.io.IOException: Server returned HTTP response code: 502 for URL: http://xx.xx.69.251/LexicalAnalyze?Type=graphjson&Key=Lsdif238fj&action=headdown&Sentence=%22%23E-s16%E4%BB%8A%E5%A4%A9%E5%87%86%E5%A4%87%E4%B8%8B%E5%8D%95%E5%B1%85%E7%84%B6%E6%B6%A8%E4%BB%B7%E4%BA%86%22
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1894)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
    at java.net.URL.openStream(URL.java:1045)
    at com.nlu.qe.service.executors.DParser.executeParser(DParser.java:96)
    at com.nlu.qe.service.executors.DParser.parse(DParser.java:72)
    at com.nlu.qe.service.executors.DParser$$FastClassBySpringCGLIB$$a7e8b65c.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
    at com.ump.annotation.JAnnotation.execJAnnotation(JAnnotation.java:105)
    at sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.nlu.qe.service.executors.DParser$$EnhancerBySpringCGLIB$$2749ab39.parse(<generated>)
    at com.nlu.qe.service.ClassificationService.classifyQuestion(ClassificationService.java:24)
    at com.nlu.qe.service.JnluQEServiceImpl.getClassification(JnluQEServiceImpl.java:95)
    at com.nlu.qe.service.JnluQEServiceImpl$$FastClassBySpringCGLIB$$71039dbb.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.nlu.qe.service.JnluQEServiceImpl$$EnhancerBySpringCGLIB$$a1da74b6.getClassification(<generated>)
    at com.nlu.qe.controller.QueryEngineController.classify(QueryEngineController.java:105)
    at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

1 个答案:

答案 0 :(得分:0)

因此,错误日志指示的502错误指出服务器端而不是客户端端发生了错误。 502代码通常表示错误的网关,因此服务器本身有问题,或者客户端和服务器之间的网关/代理重定向请求(取决于第一台服务器调用第二台服务器的方式,可能是超时)在第二台服务器上最终被第一台服务器报告为502。我将检查两者的服务器日志,以查看服务器是否耗尽了请求处理程序的连接。