rxJava 库是否与 Google Appengine 兼容?如果有,有什么限制吗?我发现的唯一信息是在 grepcode 上提到“部分支持”。 http://grepcode.com/snapshot/repo1.maven.org/maven2/com.netflix.rxjava/rxjava-core/0.9.0
什么不支持?
rxJava 库是否与 Google Appengine 兼容?如果有,有什么限制吗?我发现的唯一信息是在 grepcode 上提到“部分支持”。 http://grepcode.com/snapshot/repo1.maven.org/maven2/com.netflix.rxjava/rxjava-core/0.9.0
什么不支持?
您应该创建一个 RxJavaSchedulersHook 的子节点,并使用您的调度程序覆盖它的方法com.google.appengine.api.ThreadManager
:我已经这样做了:
public class MyThreadSchedulersHook extends RxJavaSchedulersHook {
private final Executor executor = new ScheduledThreadPoolExecutor(10, ThreadManager.backgroundThreadFactory());
@Override
public Scheduler getComputationScheduler() {
return Schedulers.from(executor);
}
@Override
public Scheduler getIOScheduler() {
return Schedulers.from(executor);
}
@Override
public Scheduler getNewThreadScheduler() {
return Schedulers.from(executor);
}
}
然后你应该注册这个钩子。最好在 ServletContextListener 实现中执行此操作:
public class ContextListener implements ServletContextListener {
@Override
public void contextInitialized(final ServletContextEvent servletContextEvent) {
RxJavaPlugins.getInstance().registerSchedulersHook(new RxMainThreadSchedulersHook());
}
@Override
public void contextDestroyed(final ServletContextEvent servletContextEvent) {
// App Engine does not currently invoke this method.
}
}
这个对我有用。
问题是 Google Appengine 中 Java 线程的限制:https ://developers.google.com/appengine/docs/java/#Java_The_sandbox
RxJava在实现Thread
中使用 Java 。所以涉及到一些并发的代码不能在Google Java Sandbox中运行。Executor
Scheduler
Scheduler
如果你想Scheduler
在 Google Appengine 中使用,你需要自己实现一个特殊Scheduler
的。此外,某些运算符可能会Scheduler
默认使用,例如默认delay
使用Schedulers.computation()
。记得使用他们的Scheduler
重载方法。