代码之家  ›  专栏  ›  技术社区  ›  user697911

如何避免这个restful服务请求错误?

  •  0
  • user697911  · 技术社区  · 7 年前

    我有一个springweb项目,它通过URL提供了一个restful服务,我把URL托管在本地机器上进行测试。

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

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

    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;
    }
    

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

    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 回复  |  直到 7 年前
        1
  •  0
  •   cleberz    7 年前

    因此,错误日志指示的502错误指出服务器端发生了错误,而不是客户端。502代码通常意味着坏网关,因此要么服务器本身有问题,要么客户端和服务器之间的某个网关/代理重定向请求(取决于第一个服务器如何调用第二个服务器,可能第二个服务器上的超时最后被第一个服务器报告为502)。我将检查两者的服务器日志,以查看服务器是否正在运行请求处理程序的连接。

    推荐文章