我通过负载均衡的Web服务器(2个Web服务器转发请求到两个应用服务器)访问其他URL时遇到问题。当设置为单个Web服务器到单个jboss应用服务器时,不会发生此问题。
以下是我从jBoss应用程序服务器日志中看到的错误消息:
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]
以下是我的休息服务:
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的主要内容:
<?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>
我期望的结果是:
{"status":"Yes","dob":"01/01/1934","userName":"John Doe","reportStatus":"No"}
在向app服务器的ip地址发出请求时,我收到了上述正确的结果 http://30.31.32.33:8080/AppName/rest/game/userStatus?userId=99984029883634
通过负载平衡Web服务器时得到的实际结果是:
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
在向Web服务器URL发出请求时,我收到了上述结果。 http://stg.testing.com/AppName/rest/game/userStatus?userId=99984029883634
注意:我通过将stg.testing.com分配给Web服务器ip进行测试 主机文件中的地址。
以下是httpd.conf文件中w.r.t设置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作为我的app服务器,使用apache作为web服务器。此Rest应用程序在后端使用axis soap webservice客户端。因此我在web.xml中有与轴相关的语句。我已经验证了soap客户端在两种情况下都能正常工作。 我不确定这是由于Web服务器问题(在AppName之前自动添加2个正斜杠)还是jboss问题,如列出的here ,here 和here 我已经尝试了以上三个jboss修复建议,但仍然有相同的错误。 任何帮助确定我的错误原因都会很棒。
更新:我尝试将servlet插入到上下文根目录下的单独目录中,并且可以从负载均衡器访问servlet。所以现在我假设这是一个软件问题而不是硬件问题。此外,在每个日志的请求期间调用org.jboss.resteasy.core.SynchronousDispatcher,我假设它不是404而是导致双正斜杠的内部重定向。任何帮助都会有用。提前谢谢。
答案 0 :(得分:0)
今天我们发现了这个问题。 该问题是由httpd.conf
中的BalancerMember URL语句中的额外“/”引起的现在,BalancerMember网址声明已更改为
.
.
<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>
.
.