Я пытаюсь перенести свое приложение на 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.