Служба подписки на хранилище событий в MongoDB
Мне было интересно, если бы было возможно создать службу подписки на Mongo
с помощью Get Event Store
? Возможно, я неправильно сформулировал это, но позвольте мне объяснить. В настоящее время у меня есть процесс, который записывает события в Mongo Database
с помощью NEventStore
, То, что я хотел бы сделать, это иметь службу подписки, которая подписывается на Stream
в Mongo
,
Не удалось найти что-либо на веб-сайте об этом, в частности, однако возможно ли это? Вкратце мой вопрос, возможно, заключается в том, можете ли вы смешать и сопоставить их вместе или для этого я должен написать свои события 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
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(); }
1 ответ
Обычный поток событий для этого будет следующим:
(учитывая, что все установлено и работает...)
- Зарегистрируйте подписчика на поток в GetEventStore в коде вашего приложения
- Сохранить события в потоке
- События появляются в вашем подписчике
Я думаю, что вы либо путаете ход вещей, либо пытаетесь сделать что-то совершенно неподдерживаемое (например, иметь подписчика MongoDb на GetEventStore). Я думаю, что ваш код делает:
- Настройка NEventStore для сохранения в MongoDb
- Подписка на поток в GetEventStore с именем "mongodb://localhost:27017/Test"
- Сохранение события в MongoDb
Насколько я вижу, вы никогда не сохраняете какие-либо события в GetEventStore, поэтому в методе EventAppeared ничего не появляется. Вы сохраняете в MongoDb.
[ОБНОВИТЬ]
Я хочу подписаться на поток Mongodb и заполнить GetEventStore, что, по моему мнению, невозможно из того, что я понял из вашего ответа.
MongoDb не имеет потоков, у него есть коллекции - это база данных документов. Потоки являются концепцией в GetEventStore. Однако, похоже, что NEventStore позволяет вам подключить диспетчер сообщений, что, вероятно, означает, что вы можете зарегистрировать обработчики для прослушивания событий. В этих обработчиках вы можете затем сохранить их в GetEventStore.