1

次のように、GoogleAppEngineの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();
...

Runnable run() では:

thread.setContextClassLoader(cl);
...
于 2013-03-05T14:17:13.610 に答える
0
`スレッド thread = ThreadManager.createBackgroundThread(new Runnable() {
    public void run() {
        ...
        ClassLoader cl = getClass().getClassLoader();
        Thread.currentThread().setContextClassLoader(cl);
        ...
    }
});`
于 2013-06-24T12:40:00.593 に答える