在Lagom中实体状态发生变化时通知实体

时间:2018-02-08 21:40:27

标签: persistence messaging lagom

假设有一个Record实体,CreateRecord命令和一个RecordCreated事件。我想在一个或多个其他实体(在不同的模块中)上调用一些命令。建议的方法是什么?

我正在考虑从Record实体的ReadSide处理程序发送一条消息,该消息可以由相应的服务接收,该服务会将其转换为命令并在实体上调用。

编辑,感谢@ ignasi35:根据Message Broker API,可以使用此代码发布消息。

AggregateEventTag<RecordEvent> RECORD_EVENT_TAG = AggregateEventTag.of(RecordEvent.class); 

public Topic<RecordMessage> recordsTopic() {
    return TopicProducer.singleStreamWithOffset(offset -> {
        return persistentEntityRegistry
                .eventStream(RECORD_EVENT_TAG, offset)
                .map(this::convertEventToRecordMessage);
    });
}

创建记录,并保留相应的事件,但以下消费者不接收任何消息:

@Singleton
public class RecordsConsumer {
    @Inject
    public RecordsConsumer(RecordService recordService){
        recordService.recordsTopic().subscribe()
            .atLeastOnce(Flow.fromFunction(this::displayMessage));
    }
}

我做错了什么?

1 个答案:

答案 0 :(得分:0)

终于解决了它。

我最终得到了一个单独的服务,从PersistentEntityRegistry.eventStream中侦听RecordCreated事件。该服务将它们转换为RecordMessage并作为主题公开(参见上面的问题)。

没有从暴露的主题接收到任何内容的问题是缺少对kafka-broker的依赖(奇怪的是没有关于此的警告,并且主题没有暴露),在我的情况下这是:

<dependency>
    <groupId>com.lightbend.lagom</groupId>
    <artifactId>lagom-javadsl-kafka-broker_2.12</artifactId>
</dependency>