Axon Server Command не содержит ключа маршрутизации - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь перенести свое приложение на Axon 4.0 с сервером Axon. Вот мой код.

data class CreateTravelProductCommand(
    @TargetAggregateIdentifier val id: String,
    val productCreator: String
)

val id: String = ObjectId.get().toString()
val command = CreateTravelProductCommand(id=id, productCreator=request.creator)
commandGateway.sendAndWait(command)

Но я получил эту ошибку с моей командой.

org.axonframework.commandhandling.distributed.CommandDispatchException: Команда [com.sunday.api.product.CreateTravelProductCommand] делает не содержат ключ маршрутизации. в org.axonframework.commandhandling.distributed.AbstractRoutingStrategy.getRoutingKey (AbstractRoutingStrategy.java:57) ~ [Аксон-сообщения-4.0.jar: 4,0] в org.axonframework.axonserver.connector.command.AxonServerCommandBus.dispatch (AxonServerCommandBus.java:114) ~ [Аксон-сервер-разъем-4.0.jar: 4,0] на org.axonframework.commandhandling.gateway.AbstractCommandGateway.send (AbstractCommandGateway.java:75) [Аксон-сообщения-4.0.jar: 4,0] на org.axonframework.commandhandling.gateway.DefaultCommandGateway.send (DefaultCommandGateway.java:78) [Аксон-сообщения-4.0.jar: 4,0] на org.axonframework.commandhandling.gateway.DefaultCommandGateway.sendAndWait (DefaultCommandGateway.java:96) [Аксон-сообщения-4.0.jar: 4,0] в com.sunday.underwriting.product.ProductHandler.sendCreateProductCommand (ProductHandler.kt: 40) [Классы /: на] в com.sunday.underwriting.product.ProductHandler.access $ sendCreateProductCommand (ProductHandler.kt: 33) [Классы /: на] на com.sunday.underwriting.product.ProductHandler $ createProduct $ product $ 1.invoke (ProductHandler.kt: 97) [Классы /: на] на com.sunday.underwriting.product.ProductHandler $ createProduct $ product $ 1.invoke (ProductHandler.kt: 33) [Классы /: на] в com.sunday.underwriting.product.ProductHandler $ sam $ java_util_function_Function $ 0.apply (ProductHandler.kt) [Классы /: на] at processor.core.publisher.FluxMap $ MapSubscriber.onNext (FluxMap.java:100) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxOnErrorResume $ ResumeSubscriber.onNext (FluxOnErrorResume.java:73) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.Operators $ MonoSubscriber.complete (Operators.java:1476) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.MonoSingle $ SingleSubscriber.onComplete (MonoSingle.java:171) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxFlatMap $ FlatMapMain.checkTermination (FluxFlatMap.java:794) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxFlatMap $ FlatMapMain.drainLoop (FluxFlatMap.java:560) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxFlatMap $ FlatMapMain.drain (FluxFlatMap.java:540) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxFlatMap $ FlatMapMain.onComplete (FluxFlatMap.java:426) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] atactor.core.publisher.DrainUtils.postCompleteDrain (DrainUtils.java:131) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] в реакторе.core.publisher.DrainUtils.postComplete (DrainUtils.java:186) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxMapSignal $ FluxMapSignalSubscriber.onComplete (FluxMapSignal.java:213) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxPeek $ PeekSubscriber.onComplete (FluxPeek.java:252) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.core.publisher.FluxMap $ MapSubscriber.onComplete (FluxMap.java:136) [Реакторного ядро-3.2.2.RELEASE.jar: 3.2.2.RELEASE] at processor.netty.channel.FluxReceive.terminateReceiver (FluxReceive.java:378) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE]at processor.netty.channel.FluxReceive.drainReceiver (FluxReceive.java:202) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] at processor.netty.channel.FluxReceive.onInboundComplete (FluxReceive.java:343) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] at реактор.netty.channel.ChannelOperations.onInboundComplete (ChannelOperations.java:325) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] at processor.netty.http.server.HttpServerOperations.onInboundNext (HttpServerOperations.java:442) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] at processor.netty.channel.ChannelOperationsHandler.channelRead (ChannelOperationsHandler.java:141) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:348) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:340) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] at processor.netty.http.server.HttpTrafficHandler.channelRead (HttpTrafficHandler.java:188) [Реактор-Netty-0.8.2.RELEASE.jar: 0.8.2.RELEASE] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:348) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:340) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.CombinedChannelDuplexHandler $ DelegatingChannelHandlerContext.fireChannelRead (CombinedChannelDuplexHandler.java:438) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead (ByteToMessageDecoder.java:310) [Netty-кодек-4.1.29.Final.jar: 4.1.29.Final] в io.netty.handler.codec.ByteToMessageDecoder.channelRead (ByteToMessageDecoder.java:284) [Netty-кодек-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.CombinedChannelDuplexHandler.channelRead (CombinedChannelDuplexHandler.java:253) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:348) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:340) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead (DefaultChannelPipeline.java:1434) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:362) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:348) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.DefaultChannelPipeline.fireChannelRead (DefaultChannelPipeline.java:965) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] на io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read (AbstractNioByteChannel.java:163) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.nio.NioEventLoop.processSelectedKey (NioEventLoop.java:628) [Netty-транспортно-4.1.29.Final.jar: 4.1.29.Final]в io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized (NioEventLoop.java:563) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] в io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:480) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] на io.netty.channel.nio.NioEventLoop.run (NioEventLoop.java:442) [netty-transport-4.1.29.Final.jar: 4.1.29.Final] на io.netty.util.concurrent.SingleThreadEventExecutor $ 5.run (SingleThreadEventExecutor.java:884) [netty-common-4.1.29.Final.jar: 4.1.29.Final] at java.lang.Thread.run (Thread.java:748) [na: 1.8.0_172]

Редактировать:

Я только что узнал, что если вы продолжитекласс в том же проекте, это нормально.

Проблема в том, что вы импортируете класс из другого проекта (который раньше работал до сервера аксонов)

Например:

Мой проект имеет зависимости другого проекта с именем api.

dependencies {
    compile project(':api')
}

Если класс объявлен в проекте api, серверная библиотека аксона выдаст ошибку tесли он не может найти ключ маршрутизации.Но если класс объявлен в основном проекте самостоятельно, он работает как положено.Я думаю, что я должен подать эту проблему на github.

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Реальная проблема заключается в несовпадении версий между двумя проектами.Мне пришлось исправить версию, но автозагрузчик intellij не работал, и у проекта api была неверная версия.

Я прошу прощения за свою глупость

0 голосов
/ 19 декабря 2018

У меня возникла такая же проблема при переходе с Axon 3.x на 4.0. Решение было связано с @TargetAggregateIdentifier - мне не хватало его в «CreateXXXCommand», который обрабатывал мой агрегат. Я почти уверен, что добавление @TargetAggregateIdentifier не было необходимо для команд создания (поскольку ему не нужно находить существующий агрегат) в Axon 3.x

На момент написания руководства Миграция была неполной https://docs.axoniq.io/reference-guide/3-migration/migration-guide

0 голосов
/ 15 ноября 2018

Это на самом деле больше связано с Котлином, чем с Аксоном. Аксон ожидает их по методу Поля или Геттера. Очевидно, это не то место, где Котлин размещает их по умолчанию.

Выезд https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets

Возможно, вам нужно аннотировать свойство с помощью @get:TargetAggregateIdentifier

...