【问题标题】:Camel and Google App Engine without Spring?没有 Spring 的 Camel 和 Google App Engine?
【发布时间】:2013-01-17 15:23:27
【问题描述】:

所以我正在复习Camel-GAE 组件,我发现的所有教程/代码示例似乎都表明您必须使用 Spring DSL (XML) 以便让 Camel 在 GAE 上运行。

这是因为Camel-GAE 依赖于Camel-Servlet,而我发现的用于在web.xml 中配置CamelServlet 的唯一代码示例涉及:

<web-app>
    <servlet>
        <servlet-name>CamelServlet</servlet-name>
        <display-name>Camel Http Transport Servlet</display-name>
        <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>appctx.xml</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>CamelServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>

我真的不是 Spring 的忠实粉丝,我更愿意使用 GIN 或 Guice 之类的东西来完成我的所有 DI。 有什么方法可以在不使用 Spring 的情况下创建 Camel Servlet 并定义其 CamelContext提前致谢。

更新 - 在 GAE 上使用 JNDI 注册表时出现的错误:

java.lang.NoClassDefFoundError: javax.naming.InitialContext is a restricted class. Please see the Google  App Engine developer's guide for more details.
    at com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
    at org.apache.camel.impl.JndiRegistry.createContext(JndiRegistry.java:103)
    at org.apache.camel.impl.JndiRegistry.getContext(JndiRegistry.java:92)
    at org.apache.camel.impl.JndiRegistry.lookup(JndiRegistry.java:65)
    at org.apache.camel.impl.JndiRegistry.lookup(JndiRegistry.java:47)
    at org.apache.camel.impl.PropertyPlaceholderDelegateRegistry.lookup(PropertyPlaceholderDelegateRegistry.java:62)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1557)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:1444)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:60)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:1412)
    at com.ourapp.server.servlets.CamelServlet.doGet(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

【问题讨论】:

    标签: java spring google-app-engine servlets apache-camel


    【解决方案1】:

    web.xml 文件不需要使用 Spring。所以从那里没有依赖要求。我只是认为在创建 camel-gae 时,示例和教程是 Web 应用程序,因此使用 spring 上下文侦听器引导 Camel 更容易。这不再需要:http://camel.apache.org/servlet-tomcat-no-spring-example.html

    我认为我们应该调查一下,我记录了一张票:https://issues.apache.org/jira/browse/CAMEL-6030

    我在升级 camel-gae 以使用更新的 GAE 版本时注意到它的 spring 依赖性。

    【讨论】:

    • 感谢@Claus Ibsen (+1) - 但是看起来ServletListener ComponentCamel Servlet 需要它以允许无 Spring 配置)使用 JNDI 注册表进行 bean 查找。如果这是不可配置的(即我可以将其更改为使用SimpleRegistry),那么它不能在 GAE 上使用,因为 JNDI 访问在 GAE 上受到限制。 SevletListener 的 bean 注册表是可配置的吗?
    • 另外,ServletListener 似乎仅适用于 2.11,根据 Camel 的网站,该版本尚未发布(!)我只能通过明确搜索“Camel 2.11”找到它下载”。这把我带到了the Apache Download Mirrors page,但每个链接都是 404。
    • 在使用 Jndi 时,您从 GAE 中看到了什么错误?我想知道我们是否可以检测到这个错误并让 Camel 回退到 SimpleRegistry。错误的堆栈跟踪有助于确定我们可以添加此类改进的位置
    • 谢谢。我已经记录了一张票,让 Camel 回退并在 JNDI 不起作用时使用简单 - issues.apache.org/jira/browse/CAMEL-6031
    • 感谢@Claus Ibsen,非常感谢您花时间记录这两张票。但回到我最初的问题,看起来,我暂时在我的 Camel-GAE 项目中使用 Spring 配置/依赖项,是吗?如果指定非 Spring 依赖项的唯一方法是通过 ServletListener 组件,并且 ServletListener 组件使用 JNDI(我不能使用),那么除了使用 Spring 来定义我的 CamelContext 之外,我别无选择,对吧?再次感谢。
    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2013-03-24
    • 2011-01-08
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多