Apache camel ServiceMixV5.3.2上的Servlet

Apache camel ServiceMixV5.3.2上的Servlet,apache-camel,apache-karaf,apache-servicemix,Apache Camel,Apache Karaf,Apache Servicemix,在从SM v5.1.4迁移到v5.3.2的过程中遇到问题。 下面的代码在v5.1.4上运行良好。servlet在HttpRegistry中使用一个键“CamelServlet”注册,它有一个单一的提供者,即CamelHttpTransportServlet和一个消费者[servlet://?MatchOnUrprefix=true] 在版本5.3.2上,出于某种原因,注册了两个HttpRegistries。第一个是“CamelServlet”,该注册表有一个消费者[servlet://?matc

在从SM v5.1.4迁移到v5.3.2的过程中遇到问题。 下面的代码在v5.1.4上运行良好。servlet在HttpRegistry中使用一个键“CamelServlet”注册,它有一个单一的提供者,即CamelHttpTransportServlet和一个消费者[servlet://?MatchOnUrprefix=true]

在版本5.3.2上,出于某种原因,注册了两个HttpRegistries。第一个是“CamelServlet”,该注册表有一个消费者[servlet://?matchOnUriPrefix=true],这很好,但该提供程序使用一个键org.ops4j.pax.web.service.spi.model.ServletModel-XXX(其中XXX是生成的整数)为HttpRegistry的另一个实例注册。现在我有两个httpregistry,一个有提供者,另一个有消费者。这样就不会调用“mainRoute”,因为消费者不是为CamelServlet注册的,而是为另一个HttpRegistry注册的。因此,当请求到来时,CamelServlet.class的服务方法中标记为{1}的代码将为使用者返回null,并且不会调用任何路由

有没有人知道什么地方出了问题,我该如何解决?多谢各位

cameservlet

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>
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"
>
javax.servlet.servlet
org.apache.camel.component.http.CamelServlet

找到了。ServiceMixV5.3.2使用了PAX包装,问题出现在
createWebElement
方法中的
org.ops4j.PAX.web.extender.whiteboard.internal.tracker.ServletTracker

在ServiceMixV5.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>
...........
。。。。。。。。。。。
javax.servlet.servlet
org.apache.camel.component.http.CamelServlet
...........
在文档中找不到此新功能的描述,因此可能有一种方法可以在配置中重写此行为,但我尚未查找。 希望这能为遇到同样问题的人节省时间