Google Appengine和rx-Java?

Pat*_*ick 5 google-app-engine rx-java

rxJava库是否与Google Appengine兼容?如果是这样有任何限制?我发现的唯一信息是grepcode上的'部分支持'. http://grepcode.com/snapshot/repo1.maven.org/maven2/com.netflix.rxjava/rxjava-core/0.9.0

什么不支持?

Rom*_*vin 6

您应该创建一个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);
}
}
Run Code Online (Sandbox Code Playgroud)

然后你应该注册这个钩子.最好在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.
}
}
Run Code Online (Sandbox Code Playgroud)

这个对我有用.


zsx*_*ing 2

问题是 Google Appengine 中 Java 线程的限制:https://developers.google.com/appengine/docs/java/#Java_The_sandbox

RxJava在实现中使用 JavaThread和。所以涉及到一些并发的代码不能在Google Java Sandbox中运行。ExecutorSchedulerScheduler

如果你想在Google Appengine中使用,你需要自己Scheduler实现一个特殊的。Scheduler另外,有些操作符可能会Scheduler默认使用,比如默认delay使用。Schedulers.computation()请记住使用它们的Scheduler重载方法。