1

Camel 2.10.3 と GAE SDK 1.7.1 を使用していることを前置きしておく必要があります。

次のコードを にパッケージ化しCamelServlet、WAR を GAE のローカル開発アプリ サーバー インスタンスにデプロイしました。

public class CamelServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        RouteBuilder routeBuilder = new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start").process(new Processor() {
                    @Override
                    public void process(Exchange arg0) throws Exception {
                        logger.warning("I am inside a Camel route!");
                    }
                }).to("direct:end");
            }
        };

        CamelContext camelContext = new DefaultCamelContext();

        try {
            camelContext.addRoutes(routeBuilder);
            camelContext.start();
            Thread.sleep(10000);
            camelContext.stop();
        }
        catch(Exception e) {
            logger.warning("Error: " + e.getMessage());
        }
    }
}

http://localhost:8888/camel(CamelServletマップされている場所) に移動すると、スタック トレースが表示されます。

java.lang.NoClassDefFoundError: java.lang.management.ManagementFactory 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.management.DefaultManagementAgent.findOrCreateMBeanServer(DefaultManagementAgent.java:364)
    at org.apache.camel.management.DefaultManagementAgent.createMBeanServer(DefaultManagementAgent.java:348)
    at org.apache.camel.management.DefaultManagementAgent.doStart(DefaultManagementAgent.java:253)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:60)
    at org.apache.camel.management.DefaultManagementStrategy.start(DefaultManagementStrategy.java:209)
    at org.apache.camel.util.ServiceHelper.startService(ServiceHelper.java:62)
    at org.apache.camel.management.ManagementStrategyFactory.create(ManagementStrategyFactory.java:40)
    at org.apache.camel.impl.DefaultCamelContext.createManagementStrategy(DefaultCamelContext.java:2490)
    at org.apache.camel.impl.DefaultCamelContext.getManagementStrategy(DefaultCamelContext.java:2310)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:1499)
    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.myapp.server.servlets.CamelServlet.doGet(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

限定?!?! Camel ルート/バスは GAE で実行されるべきではありませんか?!? Camel には GAE コンポーネント (Camel-GAE) があります。これは、実際に Camel を GAE で実行できる検証の形式だと思いました。しかし今、私はそれがGAEエンドポイントから消費するためのものであり、実際にGAEで実行されることを意図していないことを心配しています...

そのため、GAE で Camel ルートを実行/開始することができないか、DefaultCamelContextGAE 制限クラスに違反しないようにルート オブジェクト ( など) を構成する必要がある特別な方法があります。または、まったく異なる何かが起こっています。何かご意見は?前もって感謝します!

アップデート

経由で JMX をcamelContext.disableJMX();無効にすると、新しい (非常によく似た) 例外が発生します。

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.myapp.server.servlets.CamelServlet.doGet(Unknown Source)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
4

1 に答える 1

3

JMX をオフにすれば問題ありません。

// spring xml
<camel:camelContext id="camelContext">
   <!-- JMX is not supported in GAE -->
   <camel:jmxAgent id="agent" disabled="true"/>
   ...

// or in your case, java DSL
CamelContext camelContext = new DefaultCamelContext(new SimpleRegistry());
camelContext.disableJMX();

更新: また、DefaultCamelContext を使用している場合は、デフォルトの JNDI レジストリの使用を避けたい場合があります。代わりに、コンテキストを作成するときに SimpleRegistry を作成します (上記のコードを参照)。spring config camel コンテキストには、spring レジストリを使用するため、これがデフォルトとしてありません。

動作する証拠: http://camelcloud.appspot.com/

于 2013-02-01T11:23:45.163 に答える