在从SM v5.1.4迁移到v5.3.2期间遇到问题。 下面的代码在v5.1.4上完美运行。 servlet注册了一个密钥" CamelServlet "在HttpRegistry中它有一个提供者,它是CamelHttpTransportServlet和一个消费者 Consumer [servlet:///?matchOnUriPrefix = true] 。
在版本5.3.2上由于某种原因,有两个HttpRegistries被注册。第一个用键" CamelServlet "这个注册表有一个消费者 Consumer [servlet:///?matchOnUriPrefix = true] 这很好,但是提供者注册了一个不同的HttpRegistry实例,其中包含一个键 org.ops4j。 pax.web.service.spi.model.ServletModel-XXX (其中XXX是生成的整数)。所以现在我有两个HttpRegistries,一个有提供者,另一个有消费者。有了这个" mainRoute "永远不会被调用,因为消费者不是为 CamelServlet 注册,而是为另一个HttpRegistry注册。因此,当请求到来时,标记为 {1} 的CamelServlet.class的service方法中的代码将为使用者返回null,并且不会调用任何路由。
有谁知道出了什么问题以及如何解决这个问题?谢谢
CamelServlet
package org.apache.camel.component.http;
public class CamelServlet extends HttpServlet {
.........................
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
log.trace("Service: {}", request);
// Is there a consumer registered for the request.
HttpConsumer consumer = resolve(request); //{1} resolve a consumer
if (consumer == null) {
log.debug("No consumer to service request {}", request);
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
}
....................
}
骆驼情境
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/osgi-compendium http://www.springframework.org/schema/osgi-compendium/spring-osgi-compendium.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd"
>
<!--camel servlet-->
<bean id="camelServlet" class="org.apache.camel.component.servlet.CamelHttpTransportServlet"/>
<osgi:service ref="camelServlet">
<osgi:interfaces>
<value>javax.servlet.Servlet</value>
<value>org.apache.camel.component.http.CamelServlet</value>
</osgi:interfaces>
<osgi:service-properties>
<entry key="alias" value="/test" />
<entry key="matchOnUriPrefix" value="true" />
<entry key="servlet-name" value="CamelServlet"/>
</osgi:service-properties>
</osgi:service>
<camelContext xmlns="http://camel.apache.org/schema/spring" streamCache="true" trace="false">
<route id="mainRoute">
<from uri="servlet:///?matchOnUriPrefix=true"/>
<log message="Process mainRoute"/>
</route>
</camelContext>
答案 0 :(得分:0)
找到它。使用servicemix v5.3.2,使用了PAX包装器,问题出现在org.ops4j.pax.web.extender.whiteboard.internal.tracker.ServletTracker
方法的createWebElement
内。
使用Servicemix v5.1.4,除了标准服务之外的所有服务属性都被添加为servlet的初始参数。默认情况下,SM v 3.5.2只会忽略名称不以“init”开头的所有服务属性。前缀(在org.ops4j.pax.web.extender.whiteboard.ExtenderConstants.DEFAULT_INIT_PREFIX_PROP
中定义)。因此,引发了servlet-name属性被忽略的事实,在这种情况下,使用的ServletModel
对象的id恰好位于 org.ops4j.pax.web.service.spi中。 model.ServletModel-XXX 格式。对我来说简单的解决方案是在属性中添加一个' init。'前缀,以便spring conext看起来如下所示
...........
<osgi:service ref="camelServlet">
<osgi:interfaces>
<value>javax.servlet.Servlet</value>
<value>org.apache.camel.component.http.CamelServlet</value>
</osgi:interfaces>
<osgi:service-properties>
<entry key="alias" value="/test" />
<entry key="matchOnUriPrefix" value="true" />
<entry key="init.servlet-name" value="CamelServlet"/>
</osgi:service-properties>
</osgi:service>
...........
在文档中没有找到这个新功能的描述,所以可能有一种方法可以在配置中覆盖这种行为,但我没有找到它。 希望这可以为遇到同样问题的人节省时间。