【问题标题】:Servlet on servicemix v5.3.2servicemix v5.3.2 上的 Servlet
【发布时间】:2015-06-02 13:42:37
【问题描述】:

在从 SM v5.1.4 迁移到 v5.3.2 期间遇到问题。 下面的代码在 v5.1.4 上完美运行。 servlet 在 HttpRegistry 中使用键“CamelServlet”注册,它有一个提供者,即 CamelHttpTransportServlet 和一个消费者Consumer[servlet:///?matchOnUriPrefix=true]时间>。

5.3.2 版本出于某种原因注册了两个 HttpRegistries。第一个再次带有键“CamelServlet”,并且此注册表有一个消费者 Consumer[servlet:///?matchOnUriPrefix=true],这很好,但提供者是使用 org.ops4j.pax.web.service.spi.model.ServletModel-XXX 键为不同的 HttpRegistry 实例注册(其中 XXX 是生成的整数)。所以现在我有两个 HttpRegistries,一个有提供者,另一个有消费者。有了这个,“mainRoute”永远不会被调用,因为消费者不是为 CamelServlet 注册的,而是为另一个 HttpRegistry 注册的。因此,当请求到来时,CamelServlet.class 的服务方法中标有 {1} 的代码将为消费者返回 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>

【问题讨论】:

    标签: apache-camel apache-karaf apache-servicemix


    【解决方案1】:

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

    在 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>
    ...........
    

    在文档中没有找到这个新特性的描述,所以可能有一种方法可以在配置中覆盖这个行为,但我没有找到那个。 希望这可以为遇到同样问题的人节省时间。

    【讨论】:

      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      相关资源
      最近更新 更多