【问题标题】:Unable to use JDO in a GAE background thread无法在 GAE 后台线程中使用 JDO
【发布时间】:2013-01-29 10:37:14
【问题描述】:

我在 Google App Engine 中的 Runnable 对象上创建了一个后台线程,如下所示:

BackendService s = new BackendService();
thread = ThreadManager.createBackgroundThread(s);
thread.start();

但是 - 在初始化获取 PersistenceManagerFactory 时,我会这样做:

private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactional");

我得到一个类加载器异常:

Uncaught exception from servlet
com.google.apphosting.runtime.FatalError: A not-user-defined ClassLoader was set as the thread'scontextClassLoader: sun.misc.Launcher$AppClassLoader@1a8c4e7
at com.google.appengine.runtime.Request.process-f71d5e950ca508ff(Request.java)
at java.security.AccessController.doPrivileged(AccessController.java:34)

我做错了什么?

【问题讨论】:

    标签: java google-app-engine exception jdo


    【解决方案1】:

    我遇到了同样的问题(使用 JPA。)似乎可行的解决方案是手动在 Runnable 中设置类加载器。

    在调用对象中:

    private static Thread thread;
    private static ClassLoader cl;
    

    在调用方法中:

    ...
    cl = getClass().getClassLoader();
    thread = ThreadManager.createBackgroundThread(...);
    thread.start();
    ...
    

    在 Runnable run() 中:

    thread.setContextClassLoader(cl);
    ...
    

    【讨论】:

      【解决方案2】:
      `线程线程 = ThreadManager.createBackgroundThread(new Runnable() { 公共无效运行(){ ... 类加载器 cl = getClass().getClassLoader(); Thread.currentThread().setContextClassLoader(cl); ... } });`

      【讨论】:

        猜你喜欢
        • 2017-11-12
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多