1

我在 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)

我究竟做错了什么?

4

2 回答 2

5

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

在调用对象中:

private static Thread thread;
private static ClassLoader cl;

在调用方法中:

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

在可运行的 run() 中:

thread.setContextClassLoader(cl);
...
于 2013-03-05T14:17:13.610 回答
0
`线程线程 = ThreadManager.createBackgroundThread(new Runnable() {
    公共无效运行(){
        ...
        类加载器 cl = getClass().getClassLoader();
        Thread.currentThread().setContextClassLoader(cl);
        ...
    }
});`
于 2013-06-24T12:40:00.593 回答