如何使用Java中的Axon Framework将空响应与超时区分开来

时间:2016-05-24 06:06:18

标签: java cqrs axon

我发送命令并期望通过 CommandGateway.sendAndWait(对象命令,长超时,TimeUnit单位)方法获得结果:

 Greeting greeting = commandGateway.sendAndWait(new GenericCommandMessage<GetGreetingCommand>(cmd), 1000, TimeUnit.MILLISECONDS);

上述调用有3种可能的结果:

1)返回非空对象。

2)返回一个空对象(通过查询数据库的 @CommandHandler 的业务逻辑,但找不到我想要的内容)

3)返回一个空对象(如果达到超时,则由Axon框架返回)

我需要实现一种区分点2)和3)的方法,以便我可以相应地返回NOT_FOUND或REQUEST_TIMEOUT状态。您对如何建模有任何建议吗?

我的一种方法是在Greeting(我的模型对象)中添加一个状态字段,如果 @CommandHandler 从DB中没有收到任何内容,我将返回一个状态为=的虚拟Greeting对象1(意思是NOT_FOUND),但是这个解决方案意味着只为模型对象添加标志,以区分框架流,我不认为这是推荐的。

1 个答案:

答案 0 :(得分:0)

默认的CommandGateway不允许这种区别。但是,可以通过提供GatewayProxyFactory.createGateway()方法的接口来定义自己的网关。通过传递网关应在构造函数中发送消息的CommandBus来创建实例。

此机制允许您为每个方法定义所需的行为。如果声明TimeoutException,则抛出该异常而不是返回null返回值。如果每次调用的超时都相同,则可以使用注释替换超时值参数(int / long和timeunit)。

查看GatewayProxyFactory上的javadoc了解更多详情。