2017-06-14 129 views
0

試圖從春天啓動ApplicationRunner調用RxJava2,我得到一個非常神祕的例外:春天引導和RxJava2集成 - NullPointerException異常:其實不

java.lang.IllegalStateException: Failed to execute ApplicationRunner 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:770) 
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:757) 
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) 
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134) 
    at com.silanis.ps.dtool.Application.main(Application.java:37) 
Caused by: java.lang.NullPointerException: Actually not, but can't throw other exceptions due to RS 
    at io.reactivex.Flowable.subscribe(Flowable.java:12995) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12932) 
    at io.reactivex.internal.operators.flowable.FlowableZip$ZipCoordinator.subscribe(FlowableZip.java:127) 
    at io.reactivex.internal.operators.flowable.FlowableZip.subscribeActual(FlowableZip.java:79) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12986) 
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach.subscribeActual(FlowableDoOnEach.java:49) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12986) 
    at io.reactivex.internal.operators.flowable.FlowableTake.subscribeActual(FlowableTake.java:32) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12986) 
    at io.reactivex.internal.operators.flowable.FlowableDoOnEach.subscribeActual(FlowableDoOnEach.java:49) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12986) 
    at io.reactivex.internal.operators.flowable.FlowableFlatMapSingle.subscribeActual(FlowableFlatMapSingle.java:54) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12986) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12935) 
    at com.silanis.ps.dtool.services.CliRunner.run(CliRunner.java:61) 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:767) 
    ... 5 common frames omitted 
Caused by: java.lang.IllegalArgumentException: null 
    at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565) 
    at io.reactivex.internal.schedulers.NewThreadWorker.schedulePeriodicallyDirect(NewThreadWorker.java:91) 
    at io.reactivex.internal.schedulers.ComputationScheduler.schedulePeriodicallyDirect(ComputationScheduler.java:139) 
    at io.reactivex.internal.operators.flowable.FlowableInterval.subscribeActual(FlowableInterval.java:46) 
    at io.reactivex.Flowable.subscribe(Flowable.java:12986) 
    ... 20 common frames omitted 

是什麼java.lang.NullPointerException: Actually not, but can't throw other exceptions due to RS實際上意味着什麼呢?有

事做

Caused by: java.lang.IllegalArgumentException: null 
at java.util.concurrent.ScheduledThreadPoolExecutor.scheduleAtFixedRate(ScheduledThreadPoolExecutor.java:565) 
at io.reactivex.internal.schedulers.NewThreadWorker.schedulePeriodicallyDirect(NewThreadWorker.java:91) 

答:

正如在這個問題上的意見mentionned,當Flowable.interval用的0值初始化拋出此錯誤。將該值設置爲正值解決了問題。

+0

這是我最喜歡的錯誤消息之一:)它表示提示調查的操作員中的錯誤。事實上,正如@Kiskae所說的,不積極的時期不會被處理(或不被允許)。理論上,它可能表明立即重新安排,但通常這種非常高的頻率執行不是開發人員想要的。如果你能弄清楚爲什麼你有一個零或更少的時間,這將是非常好的。 – akarnokd

+0

@akarnokd我會繼續調查......這可能與'ApplicationRunner'' run'方法在與rxjava代碼不同的某個線程中執行的事實有關嗎?我過於簡單的測試似乎表明run方法比rxjava代碼更快完成,並且很可能Spring Boot關閉了jvm。這是否會導致這種異常發生?如果是這樣,我將需要看看如何用rxjava'observeOn'或'subscribeOn'來鉤住Spring線程(我還不太熟悉如何使用這些...)。感謝您的幫助,並讓我知道您的想法。 – simon

+0

我懷疑Spring使用Flowable.interval來處理任何事情,所以應該在代碼中有一些以0或負數結束的事情,或許是依賴注入缺失的缺失或錯誤配置。 – akarnokd

回答

2

Caused by: java.lang.IllegalArgumentException: null

這不是一個非常有用的例外,但它似乎是例外,根據源代碼時發生period <= 0

由於您簡化了代碼,因此不清楚該值可能會出現的位置,但似乎在提供給Flowable.interval的期間爲0或負值時會發生此錯誤。出於某種原因,RxJava接受ThreadPoolExecutor不接受的一段0

編輯:當RxJava 2.1.1發佈此錯誤將被修復並導致即時重新安排可運行的if period <= 0