0

我通过CommandGateway.sendAndWait(Object command, long timeout, TimeUnit unit)方法发送命令并期待结果:

 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 接收到任何内容,我将返回一个 status = -1 的虚拟 Greeting 对象(意思是 NOT_FOUND),但这个解决方案会意味着向模型对象添加标志只是为了区分框架流,我不认为这是推荐的。

4

1 回答 1

1

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

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

查看GatewayProxyFactory上的 javadoc了解更多详细信息。

于 2016-05-25T19:28:39.383 回答