【问题标题】:No handler was subscribed to command. Axon 3.3没有处理程序订阅命令。轴突 3.3
【发布时间】:2018-09-26 15:05:07
【问题描述】:

我正在尝试通过教程创建基本的 Axon/Spring 应用程序,但遇到了奇怪的错误,例如:NoHandlerForCommandException: No handler was subscribed to command。好像Axon看不到@CommandHandler注解。

这是我的文件:

聚合

@Aggregate
@NoArgsConstructor
public class Account {

    @AggregateIdentifier
    private UUID accountId;
    private Double balance;

    @CommandHandler
    public Account(CreateAccountCommand command) {
        apply(new AccountCreatedEvent(command.getAccountId(), command.getName()));
    }

    @EventSourcingHandler
    protected void on(AccountCreatedEvent event) {
        this.accountId = event.getAccountId();
        this.balance = 0.0;
    } 
}

事件

@AllArgsConstructor
@Getter
public class AccountCreatedEvent {

    private UUID accountId;
    private String name;
}

命令

@Getter
public class CreateAccountCommand {

    @TargetAggregateIdentifier
    private UUID accountId;
    private String name;

    public CreateAccountCommand(UUID accountId, String name) {
        this.accountId = accountId;
        this.name = name;
    }
}

春季启动配置

@SpringBootApplication
public class App {

    @Configuration
    public static class TestConfiguration {
        @Bean
        public EventStorageEngine inMemoryEventStorageEngine() {
            return new InMemoryEventStorageEngine();
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

这就是我发送 cmd 的方式

@Component
public class AppLoader {

    @Autowired
    private CommandGateway cmdGateway;

    @PostConstruct
    public void init() {
        cmdGateway.send(new CreateAccountCommand(UUID.randomUUID(), "test"));
    }
}

我的 build.gradle

buildscript {
    ext {
        springBootVersion = '2.0.5.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'io.yourpoint.nettnews'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile group: 'org.axonframework', name: 'axon-test', version: '3.3.5'
    compile group: 'org.axonframework', name: 'axon-spring-boot-starter', version: '3.3.5'
    compile('org.springframework.boot:spring-boot-starter-webflux')
    compileOnly('org.projectlombok:lombok')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('io.projectreactor:reactor-test')
}

【问题讨论】:

    标签: spring-boot cqrs axon


    【解决方案1】:

    对于 Axon 来说,在 @PostConstruct 中执行 CommandGateway#send() 调用很可能为时过早..

    就目前而言,所有的命令、事件和查询处理程序通常会在您的所有 bean 都已初始化之后进行注册。 将 CommandGateway#send() 移到 REST 端点后面应该会给您足够长的时间来确保所有处理程序都已注册。

    因此,简而言之,您获得NoHandlerForCommandException 的原因是时间问题。

    我们(在 AxonIQ)看到了在所有处理程序都已注册后立即发送某种应用程序事件的好处。不过,这是未来的事情。

    希望这对您有所帮助 @Benjamin!

    【讨论】:

    • 应用程序事件有什么更新吗?我遇到了类似的情况。
    • 正在等待 4.6.0,这是即将发布的 AF 次要版本。我打赌我们应该能够解决它,尽管我没有对此做出任何承诺。如果你有兴趣,你可以在这里找到问题,tbeernot:github.com/AxonFramework/AxonFramework/issues/880
    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2021-06-06
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 2018-01-26
    相关资源
    最近更新 更多