我想知道是否可以通过Get Event Store
创建对Mongo
的订阅服务?也许我的措辞不正确,但让我解释一下。我目前有一个进程,它使用NEventStore
将事件写入Mongo Database
。我想做的是有一个订阅服务,它订阅Mongo
中的Stream
。
在互联网上找不到任何关于这一点的特别信息,但这可能吗?简而言之,我的问题可能是,你能将两者混合匹配在一起吗?或者为了做到这一点,我必须将我的事件写入eventstore
,而不是Mongo
?也许,我做错了,还有其他选择吗?
我可以看到我的事件正在写入,但它未能触发EventAppeared
。目前,所有这些都是在我的机器上本地完成的。
我试着创建了一个精简的应用程序,它可以做到这一点:
-
使用以下创建订阅
using (var connection = EventStoreConnection.Create(new IPEndPoint(IPAddress.Loopback, 1113))) { connection.SubscribeToStreamAsync(@"mongodb://localhost:27017/Test", false, EventAppeared, SubscriptionDropped); var repository = new NEventStoreRepository(); repository.Write(new SomethingHasHappened("Hello")); Console.ReadLine(); } private static void SubscriptionDropped(EventStoreSubscription arg1, SubscriptionDropReason arg2, Exception arg3) { } private static void EventAppeared(EventStoreSubscription arg1, ResolvedEvent arg2) { }
-
我通过NEventStore 将事件写入我的mongo数据库
public void Write(object @event) { var id = Guid.NewGuid(); using (var scope = new TransactionScope()) { using (var store = WireupEventStore()) { using (var stream = store.OpenStream(id.ToString(), 0, int.MaxValue)) { stream.Add(new EventMessage { Body = @event }); stream.CommitChanges(Guid.NewGuid()); scope.Complete(); } } } Console.ReadKey(); } private static IStoreEvents WireupEventStore() { return Wireup .Init() .LogToOutputWindow() .UsingMongoPersistence("NEventStore.MongoDB", new DocumentObjectSerializer()) .InitializeStorageEngine() .UsingJsonSerialization() .Build(); }
这方面的正常事件流如下:
(假设所有东西都已安装并正在运行…)
- 在您的GetEventStore中注册流的订阅者应用程序代码
- 将事件保存到流
- 事件显示在您的订阅服务器中
我认为你要么混淆了事情的流程,要么试图做一些完全不受支持的事情(比如让MongoDb订阅GetEventStore)。我认为您的代码正在做的是:
- 设置NEventStore以保存到MongoDb
- 正在订阅GetEventStore中名为"的流mongodb://localhost:27017/Test"
- 将事件保存到MongoDb
据我所见,您从未将任何事件保存到GetEventStore,因此EventAppared方法中从未出现任何事件。您正在保存到MongoDb。
[更新]
我想订阅Mongodb流并填充GetEventStore,根据我从您的回答中收集到的信息,我认为这是不可能的。
MongoDb没有流,它有集合——它是一个文档数据库。流是GetEventStore中的一个概念。然而,看起来NEventStore允许您挂接消息调度程序,这可能意味着您可以注册处理程序来侦听事件。在这些处理程序中,您可以保存到GetEventStore。