2017-12-01 11 views
0

부하 분산 웹 서버를 통해 나머지 URL을 방문하는 데 문제가 있습니다 (두 개의 응용 프로그램 서버로 2 개의 웹 서버 전달 요청). 설정이 단일 웹 서버에서 단일 jboss 응용 프로그램 서버로 설정되면이 문제가 발생하지 않습니다.고유 한 난처한 JBoss resteasy 오류 - 리소스를 찾을 수 없습니다.

package com.testing.game; 

import java.io.Serializable; 

import com.fasterxml.jackson.annotation.JsonInclude; 

import javax.ws.rs.Consumes; 
import javax.ws.rs.DefaultValue; 
import javax.ws.rs.GET; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.QueryParam; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

import org.apache.log4j.Logger; 

@Path("/game") 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class GameRest implements Serializable{ 
    /** 
    * 
    */ 
    private static final long serialVersionUID = 9029403154444232148L; 
    private final static Logger logger = Logger.getLogger(GameRest.class); 

    @GET 
    @Path("/userStatus") 
    @Produces(MediaType.APPLICATION_JSON) 
    public UserReportStatus getUserStatus(
      @QueryParam("userId") @DefaultValue("") String userId){ 
     logger.info("received request getReportStatus " + userId); 
     GameService gs = new GameService(); 
     return gs.getUserReportStatus(userId); 
    } 
} 

다음은 web.xml 파일의 주요 내용이다 : 내 나머지 서비스에 따라

16:02:46,711 DEBUG [org.jboss.resteasy.core.SynchronousDispatcher] (http-/30.31.32.33:8080-14) PathInfo: //AppName/rest/game/userStatus 
16:02:46,711 DEBUG [org.jboss.resteasy.core.SynchronousDispatcher] (http-/30.31.32.33:8080-14) Failed executing GET //AppName/rest/game/userStatus: org.jboss.resteasy.spi.NotFoundException: Could not find resource for relative : //AppName/rest/game/userStatus of full path: http://stg.testing.com//AppName/rest/game/userStatus?userId=99984029883634 
    at 
org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:360) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:374) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:367) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:315) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:173) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:118) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.3.3.Final-redhat-1.jar:2.3.3.Final-redhat-1] 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.1.Final-redhat-1.jar:1.0.1.Final-redhat-1] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:679) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931) [jbossweb-7.0.16.Final-redhat-1.jar:] 
    at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_37] 

됩니다 : 다음

오류 나는 제이보스 애플리케이션 서버 로그에서 볼 메시지입니다

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:.. id="WebApp_ID" version="2.5"> 
    <display-name>AppName_Axis1</display-name> 
    <!-- Auto scan REST service --> 
    <context-param> 
     <param-name>resteasy.scan</param-name> 
     <param-value>true</param-value> 
    </context-param> 

    <!-- this need same with resteasy servlet url-pattern --> 
    <context-param> 
     <param-name>resteasy.servlet.mapping.prefix</param-name> 
     <param-value>/rest</param-value> 
    </context-param> 

    <listener> 
     <listener-class> 
      org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class> 
    </listener> 

    <servlet> 
     <display-name>Apache-Axis Servlet</display-name> 
     <servlet-name>AxisServlet</servlet-name> 
     <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>AxisServlet</servlet-name> 
     <url-pattern>/servlet/AxisServlet</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>AxisServlet</servlet-name> 
     <url-pattern>*.jws</url-pattern> 
    </servlet-mapping> 
    <servlet-mapping> 
     <servlet-name>AxisServlet</servlet-name> 
     <url-pattern>/services/*</url-pattern> 
    </servlet-mapping> 
    <servlet> 
     <display-name>Axis Admin Servlet</display-name> 
     <servlet-name>AdminServlet</servlet-name> 
     <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class> 
     <load-on-startup>100</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>AdminServlet</servlet-name> 
     <url-pattern>/servlet/AdminServlet</url-pattern> 
    </servlet-mapping> 
    <servlet> 
     <servlet-name>resteasy-servlet</servlet-name> 
     <servlet-class> 
      org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher 
     </servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>resteasy-servlet</servlet-name> 
     <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

예상되는 결과는 다음과 같습니다. 부하가 분산 된 웹 서버를 통해 갈 때 내가 얻을 수 있도록 http://30.31.32.33:8080/AppName/rest/game/userStatus?userId=99984029883634

실제 결과와 같은 응용 프로그램 서버의 IP 주소에 요청을 할 때

{"status":"Yes","dob":"01/01/1934","userName":"John Doe","reportStatus":"No"} 

내가 위의 올바른 결과가 있습니다 :

HTTP Status 404 - Could not find resource for relative : //AppName/rest/game/userStatus of full path: http://stg.testing.com//AppName/rest/game/userStatus?userId=99984029883634 

웹 서버 URL에 요청할 때 위의 결과가 나타납니다. http://stg.testing.com/AppName/rest/game/userStatus?userId=99984029883634

참고 : 나는 hosts 파일에서 웹 서버의 IP 주소로 stg.testing.com을 할당하여 테스트했습니다.

다음은 httpd.conf 파일에서 app 서버의 이름/IP 주소가 표시되는 위치의 설정입니다.

<Proxy balancer://stgsilo stickysession=JSESSIONID> 
    BalancerMember http://30.31.32.33:8080/ min=10 max=100 route=node1 loadfactor=1 
    BalancerMember http://30.31.32.34:8080/ min=10 max=100 route=node2 loadfactor=1 
</proxy> 

<Proxy balancer://stgsiloadmin stickysession=JSESSIONID> 
    BalancerMember http://30.31.32.33:9990/ min=10 max=100 route=node1 loadfactor=1 
    BalancerMember http://30.31.32.34:9990/ min=10 max=100 route=node2 loadfactor=1 
</Proxy> 

ProxyPass/balancer://stgsilo/ 
ProxyPass /console balancer://stgsiloadmin/console 
ProxyPass /management balancer://stgsiloadmin/management 

ProxyPassReverse/http://30.31.32.33:8080 
ProxyPassReverse/http://30.31.32.34:8080 

ProxyPassReverse /console http://30.31.32.33:9990/console 
ProxyPassReverse /console http://30.31.32.34:9990/console 

ProxyPassReverse /management http://30.31.32.33:9990/management 
ProxyPassReverse /management http://30.31.32.34:9990/management 

<Proxy *BATCHJOB*> 
Order Deny,Allow 
Allow from 30. 
Deny from all 
</Proxy> 

<Proxy *-WS*> 
Order Deny,Allow 
Allow from all 
</Proxy> 

내 응용 프로그램 서버로 jboss 7.1.2를 사용하고 웹 서버로 apache를 사용하고 있습니다. 이 Rest 앱은 백엔드에서 축 비누 웹 서비스 클라이언트를 사용합니다. 따라서 web.xml에 axis 관련 문이 있습니다. 두 경우 모두 비누 클라이언트가 작동하는지 확인했습니다. 나는 때문에 내가 보스 수정을 위해 위의 세 가지 권장 사항을 시도 herehere 웹 서버 문제 (자동 프로그램 응용하기 전에 슬래시이 앞으로 추가) 또는 here 나열된 것과 같은 JBoss의 문제,이 경우 확실하지 않다 여전히 동일한 오류가 있습니다. 오류의 원인을 확인하는 데 도움이 될 것입니다.

업데이트 : 컨텍스트 루트 아래 별도의 디렉토리에 서블릿을 삽입하고 서블릿을로드 밸런서에서 연결할 수 있습니다. 그래서 지금은 이것이 하드웨어 문제가 아니라 소프트웨어 문제라고 가정합니다. 또한 org.jboss.resteasy.core.SynchronousDispatcher가 요청 동안 로그마다 호출되기 때문에 404가 아니라 내부 슬래시로 인해 슬래시가 두 번 발생한다고 가정합니다. 어떤 도움이 유용 할 것입니다. 미리 감사드립니다.

답변

0

오늘이 문제를 발견했습니다. 이 문제는 httpd의 BalancerMember URL 문에 "/"가 추가로 발생했습니다.

conf의

그래서 지금 BalancerMember URL이 문은

. 
. 
<Proxy balancer://stgsilo stickysession=JSESSIONID> 
    BalancerMember http://30.31.32.33:8080 min=10 max=100 route=node1 loadfactor=1 
    BalancerMember http://30.31.32.34:8080 min=10 max=100 route=node2 loadfactor=1 
</proxy> 
. 
. 
로 변경되었습니다