oracle / oracle-r2dbc

R2DBC Driver for Oracle Database
https://oracle.com
Other
197 stars 40 forks source link

Class Cast Exceptio when I call subscribe method on a Mono #89

Closed karthickbhaskar closed 1 year ago

karthickbhaskar commented 2 years ago

Sample Code:

Exception takes place in the highlighted code in bold below

testSubscriptionMono.flatMap(testSubscription -> { testSubscription.setMembershipStatus("ENROLLED"); return repositoryService.saveTestSubscription(testSubscription); }).subscribe(value -> System.out.println("RECEIVED " + value), error -> error.printStackTrace());

Depdendencies:

image

Error Logs:

java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.Integer (java.lang.Long and java.lang.Integer are in module java.base of loader 'bootstrap') at java.base/java.util.stream.Collectors.lambda$summingInt$19(Collectors.java:673) at reactor.core.publisher.MonoStreamCollector$StreamCollectorSubscriber.onNext(MonoStreamCollector.java:132) at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmit(FluxFlatMap.java:543) at reactor.core.publisher.FluxFlatMap$FlatMapInner.onNext(FluxFlatMap.java:984) at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200) at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onNext(FluxConcatArray.java:364) at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:118) at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299) at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398) at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.request(FluxMapFuseable.java:360) at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:191) at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.request(FluxConcatArray.java:461) at reactor.core.publisher.FluxPeek$PeekSubscriber.request(FluxPeek.java:138) at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:964) at reactor.core.publisher.FluxPeek$PeekSubscriber.onSubscribe(FluxPeek.java:171) at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onSubscribe(FluxConcatArray.java:350) at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:87) at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onSubscribe(FluxMapFuseable.java:265) at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55) at reactor.core.publisher.Flux.subscribe(Flux.java:8466) at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onComplete(FluxConcatArray.java:443) at reactor.core.publisher.FluxConcatArray.subscribe(FluxConcatArray.java:73) at reactor.core.publisher.Flux.subscribe(Flux.java:8466) at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:426) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539) at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) at reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onNext(MonoFlatMapMany.java:250) at reactor.core.publisher.FluxUsingWhen$UsingWhenSubscriber.onNext(FluxUsingWhen.java:345) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200) at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onNext(FluxConcatArray.java:201) at reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onNext(MonoFlatMapMany.java:250) at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398) at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onSubscribeInner(MonoFlatMapMany.java:150) at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:189) at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) at oracle.r2dbc.impl.AsyncLock.lambda$get$2(AsyncLock.java:167) at oracle.r2dbc.impl.AsyncLock.unlock(AsyncLock.java:125) at oracle.r2dbc.impl.AsyncLock$UsingConnectionSubscriber.terminate(AsyncLock.java:516) at oracle.r2dbc.impl.AsyncLock$UsingConnectionSubscriber.onComplete(AsyncLock.java:502) at reactor.core.publisher.StrictSubscriber.onComplete(StrictSubscriber.java:123) at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:2058) at org.reactivestreams.FlowAdapters$FlowToReactiveSubscriber.onComplete(FlowAdapters.java:221) at oracle.jdbc.internal.CompletionStageUtil$IteratorSubscription.emitComplete(CompletionStageUtil.java:805) at oracle.jdbc.internal.CompletionStageUtil$IteratorSubscription.emitItems(CompletionStageUtil.java:752) at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426) at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020) at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656) at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

saikrir commented 2 years ago

I am having the same issue upon executing update query

karthickbhaskar commented 2 years ago

@saikrir Any subsequent updates/inserts chanined inside this is failing . Is it happening for you

saikrir commented 2 years ago

@karthickbhaskar - My terminal operation performs update, so I am not sure if subsequent updates or inserts fail.

karthickbhaskar commented 2 years ago

@saikrir : sure . got it .

@Michael-A-McMahon : Any idea on this issue ?

Michael-A-McMahon commented 2 years ago

Stack suggests there is a summingInt Collector somewhere in the stack. I suspect it breaks because 1.0.0 release of R2DBC returns update counts as Long objects, where the previous release returned Int objects.

Noting that your Spring and R2DBC Pool dependencies are built for the 0.9.1 release of R2DBC. This likely the cause. If new versions of the dependencies are available, and these versions are built for the 1.0.0 release of R2DBC, then updating may resolve the issue.

The key point is that Oracle R2DBC is only compatible with libraries that support r2dbc-spi-1.0.0 (or newer).

Michael-A-McMahon commented 2 years ago

@karthickbhaskar, @saikrir, and @GohKianSeng: Just wanted to check in on this. Were you able to find resolution after updating the libraries, such that all were depending on version 1.0.0 of the r2dbc-spi?

Michael-A-McMahon commented 2 years ago

At the moment, I think Spring programmers should stay on version 0.4.0 of Oracle R2DBC. Our 0.4.0 version should be compatible with the current version of Spring Data R2DBC (1.5.x).

However, we can look forward to a later release of the Spring Data Relational project. It seems that an update to the 1.0 SPI is on the way. I see this comment in a milestone release for 3.0.0.M5:

Upgrade to R2DBC 1.0 https://github.com/spring-projects/spring-data-relational/issues/1292

https://github.com/spring-projects/spring-data-relational/releases/tag/3.0.0-M5

@mp911de: Please feel free to correct me if I'm wrong about anything.

mp911de commented 2 years ago

What Michael said.

Use the Oracle driver version 0.4 when using Spring Framework 5.3.x and Spring Boot 2.x. Spring Framework 6.0 and Spring Boot 3.0 will be compatible with Oracle driver version 1.0.

Michael-A-McMahon commented 1 year ago

Closing this issue as it #89 appears to be a duplicate