ReactiveDefaultBookmarkManager is causing ConcurrentModificationException with Spring-Boot > 3.1.1 (Webflux + Data Neo4j)

125 Views Asked by At

The following code works fine with spring-boot 3.1.1. With any version > 3.1.1 (I tried 3.1.2, 3.1.3, 3.1.4 and 3.1.5) it will throw a ConcurrentModificationException, if I try to insert more than ~300 Nodes in the DataInitializer Class.

Any idea what causes this or how to fix it?

TestApplication.java

@SpringBootApplication
@EnableReactiveNeo4jRepositories
public class TestApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(TestApplication.class, args);
    }

    @Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_TRANSACTION_MANAGER_BEAN_NAME)
    public ReactiveTransactionManager reactiveTransactionManager(Driver driver, ReactiveDatabaseSelectionProvider databaseNameProvider)
    {
        return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider);
    }

    @Bean
    Configuration cypherDslConfiguration()
    {
        return Configuration.newConfig().withDialect(Dialect.NEO4J_5).build();
    }
}

Book.java

@Node
@Data
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Book
{
    @Id
    @GeneratedValue(generatorClass = UUIDGenerator.class)
    private UUID id;
    private String title;
    private String genre;
    @CreatedDate
    private LocalDateTime createdDate;
    @CreatedBy
    private String createdBy;
}

DataInitializer.java (creating 1 to n nodes) if n > ~300 it will crash

@Component
@Slf4j
@RequiredArgsConstructor
class DataInitializer implements CommandLineRunner
{
    private final ReactiveNeo4jClient client;
    private final BookService bookService;

    @Override
    public void run(String[] args)
    {
        log.info("start data initialization  ...");
        Faker faker = new Faker();

        this.bookService.deleteAll()
                        .thenMany(Flux.range(1, 3000) 
                                      .flatMap(count -> {
                                          Book book = Book.builder()
                                                          .title(faker.book().title())
                                                          .genre(faker.book().genre())
                                                          .build();

                                          return this.bookService.saveBook(book);
                                      })
                        )
                        .log()
                        .then()
                        .doOnNext(v -> this.client
                                        .query("MATCH (p:Book) RETURN p")
                                        .fetchAs(Book.class)
                                        .mappedBy((t, r) -> (Book) (r.get("p").asObject()))
                                        .all()
                                        .subscribe(c -> log.info(c.toString()))
                        )
                        .subscribe(null,
                                   null,
                                   () -> log.info("done data initialization..."));
    }
}

BookService.java

@Service
@Slf4j
@RequiredArgsConstructor
public class BookService
{
    private final BookRepository bookRepository;

    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public Mono<Book> saveBook(Book book)
    {
        return this.bookRepository.save(book);
    }
}

BookRepository.java

public interface BookRepository extends ReactiveNeo4jRepository<Book, UUID>
{
}

Exception ->

java.util.ConcurrentModificationException: null
    at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1597) ~[na:na]
    at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1620) ~[na:na]
    at java.base/java.util.AbstractCollection.addAll(AbstractCollection.java:335) ~[na:na]
    at java.base/java.util.HashSet.<init>(HashSet.java:121) ~[na:na]
    at org.springframework.data.neo4j.core.transaction.ReactiveDefaultBookmarkManager.updateBookmarks(ReactiveDefaultBookmarkManager.java:65) ~[spring-data-neo4j-7.1.5.jar:7.1.5]
    at org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager.lambda$doCommit$14(ReactiveNeo4jTransactionManager.java:328) ~[spring-data-neo4j-7.1.5.jar:7.1.5]
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:185) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:140) ~[reactor-core-3.5.11.jar:3.5.11]
    at org.neo4j.driver.internal.reactive.RxUtils.lambda$createEmptyPublisher$0(RxUtils.java:44) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[na:na]
    at org.neo4j.driver.internal.util.Futures.lambda$futureCompletingConsumer$3(Futures.java:222) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[na:na]
    at org.neo4j.driver.internal.handlers.CommitTxResponseHandler.onSuccess(CommitTxResponseHandler.java:40) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.async.inbound.InboundMessageDispatcher.handleSuccessMessage(InboundMessageDispatcher.java:93) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.messaging.common.CommonMessageReader.unpackSuccessMessage(CommonMessageReader.java:57) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.messaging.common.CommonMessageReader.read(CommonMessageReader.java:47) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:80) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:36) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at org.neo4j.driver.internal.async.inbound.MessageDecoder.channelRead(MessageDecoder.java:42) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[netty-handler-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.100.Final.jar:4.1.100.Final]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]



java.lang.IllegalStateException: Transaction synchronization is not active
    at org.springframework.transaction.reactive.TransactionSynchronizationManager.getSynchronizations(TransactionSynchronizationManager.java:233) ~[spring-tx-6.0.13.jar:6.0.13]
    at org.springframework.transaction.reactive.AbstractReactiveTransactionManager.triggerAfterCompletion(AbstractReactiveTransactionManager.java:622) ~[spring-tx-6.0.13.jar:6.0.13]
    at org.springframework.transaction.reactive.AbstractReactiveTransactionManager.lambda$doRollbackOnCommitException$32(AbstractReactiveTransactionManager.java:563) ~[spring-tx-6.0.13.jar:6.0.13]
    at reactor.core.publisher.Mono.lambda$onErrorResume$29(Mono.java:3859) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:94) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onError(MonoIgnoreElements.java:84) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.error(MonoCreate.java:201) ~[reactor-core-3.5.11.jar:3.5.11]
    at org.neo4j.driver.internal.reactive.RxUtils.lambda$createEmptyPublisher$0(RxUtils.java:42) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.uniWhenCompleteStage(CompletableFuture.java:887) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:2325) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.whenComplete(CompletableFuture.java:144) ~[na:na]
    at org.neo4j.driver.internal.reactive.RxUtils.lambda$createEmptyPublisher$1(RxUtils.java:39) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.Mono.subscribe(Mono.java:4495) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnorePublisher.subscribe(MonoIgnorePublisher.java:57) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.Mono.subscribe(Mono.java:4495) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.Mono.subscribe(Mono.java:4495) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:263) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.Mono.subscribe(Mono.java:4495) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:103) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onError(MonoIgnoreThen.java:278) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreElements$IgnoreElementsSubscriber.onError(MonoIgnoreElements.java:84) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onError(FluxPeek.java:222) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:194) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:292) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:187) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203) ~[reactor-core-3.5.11.jar:3.5.11]
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:140) ~[reactor-core-3.5.11.jar:3.5.11]
    at org.neo4j.driver.internal.reactive.RxUtils.lambda$createEmptyPublisher$0(RxUtils.java:44) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[na:na]
    at org.neo4j.driver.internal.util.Futures.lambda$futureCompletingConsumer$3(Futures.java:222) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510) ~[na:na]
    at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147) ~[na:na]
    at org.neo4j.driver.internal.handlers.CommitTxResponseHandler.onSuccess(CommitTxResponseHandler.java:40) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.async.inbound.InboundMessageDispatcher.handleSuccessMessage(InboundMessageDispatcher.java:93) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.messaging.common.CommonMessageReader.unpackSuccessMessage(CommonMessageReader.java:57) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.messaging.common.CommonMessageReader.read(CommonMessageReader.java:47) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:80) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at org.neo4j.driver.internal.async.inbound.InboundMessageHandler.channelRead0(InboundMessageHandler.java:36) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at org.neo4j.driver.internal.async.inbound.MessageDecoder.channelRead(MessageDecoder.java:42) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) ~[netty-codec-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:286) ~[netty-handler-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.100.Final.jar:4.1.100.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.100.Final.jar:4.1.100.Final]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
    Suppressed: org.neo4j.driver.exceptions.ClientException: Can't rollback, transaction has been committed
        at org.neo4j.driver.internal.async.UnmanagedTransaction.lambda$closeAsync$13(UnmanagedTransaction.java:337) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
        at org.neo4j.driver.internal.util.LockUtil.executeWithLock(LockUtil.java:39) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
        at org.neo4j.driver.internal.async.UnmanagedTransaction.closeAsync(UnmanagedTransaction.java:331) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
        at org.neo4j.driver.internal.async.UnmanagedTransaction.rollbackAsync(UnmanagedTransaction.java:186) ~[neo4j-java-driver-5.13.0.jar:5.13.0-c7381da0d9e7e2ff961f475b4ecb2c864c3b2751]
        ... 70 common frames omitted

2023-10-28T13:42:56.709+02:00 ERROR 9208 --- [oundedElastic-1] reactor.core.publisher.Operators         : Operator called default onErrorDropped

Update 1: If I change the ReactiveTransactionManager configuration to (using Neo4jBookmarkManager.noop()) it works fine, but this seems quite hacky ->

@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_TRANSACTION_MANAGER_BEAN_NAME)
public ReactiveTransactionManager reactiveTransactionManager(Driver driver, ReactiveDatabaseSelectionProvider databaseNameProvider)
{    
   return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider, Neo4jBookmarkManager.noop());
}
0

There are 0 best solutions below