gpt4 book ai didi

java - RxJava2中如何正确释放资源?

转载 作者:行者123 更新时间:2023-12-02 10:47:16 24 4
gpt4 key购买 nike

我正在 Java 中使用 Selenium 和 ChromeDriver 编写一个爬虫,我想将它包装到 Observable 中(为了更容易异步)。这是从我的解析器类返回 Observable 的代码:

return Observable.interval(5000, 5000, TimeUnit.MILLISECONDS)
.doOnSubscribe(ignored -> initialize())
.doOnNext(ignored -> refreshPage())
.map(ignored -> getHtml())
.map(this::parse)
.flatMap(Observable::fromIterable)
.doFinally(() -> finish())
.share();

所以在这里,initialize() 基本上创建了 Selenium WebDriver 的配置实例,refreshPage() 重新加载页面并等待其加载,getHtml( ) 只是 driver.getPageSource()finish()driver.quit() 其中 driver code> 是 Selenium WebDriver 的一个实例。我遇到的问题是当我订阅这个 Observable 并稍后处理它时。我从 refreshPage() 得到一个异常,表示我在 driver.quit() 之后调用了 driver 上的方法(或者在上面的代码中)这意味着 refreshPage()finish() 之后调用。

我应该如何创建/修改我的源 Observable 以便我的资源在处置时正确释放? (我希望 finish() 始终在 Observable 链中的其他所有内容完成后被调用)。

更新:我的 finish() 函数是:

public void finish() {
driver.quit();
}

最佳答案

doFinally正如你所怀疑的那样。它执行关联的Action之后:

  • onError ,
  • onComplete ,或
  • 关联的下游取消/处置流

但是,我怀疑可能发生的是您可能正在调用 driver.quit()finish() 的体内,而不是在 Action 中它返回。假设driver用于refreshPage()内,自从实际调用 doFinally() 以来,该错误是有意义的本身(不是它返回的 Action)是尽早完成以构建流行为,并且 refreshPage()是此后流中的最早点 driver已使用。

如果您的代码如下所示:

private Action finish() {
driver.quit();

return () -> {
...
};
}

...然后将调用移至 quit()Action 的体内,例如:

private Action finish() {
return () -> {
driver.quit();
};
}

如果我的假设是错误的,您可以使用 finish() 的代码更新问题吗? ?我很想看看那里发生了什么。

关于java - RxJava2中如何正确释放资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com