如何使用EventStore嵌入式客户端?

dan*_*wig 3 .net database get-event-store

似乎没有关于如何使用EventStore.Client.Embedded nuget包设置,运行和连接到嵌入式EventStore客户端的文档.使用以下代码:

ClusterVNode node = EmbeddedVNodeBuilder
    .AsSingleNode()
    .RunInMemory()
    .OnDefaultEndpoints()
    .Build();

var connection = EmbeddedEventStoreConnection.Create(node);
await connection.ConnectAsync();
var sampleEventData = new EventData(Guid.NewGuid(), "myTestEvent", false, new byte[] { 6, 10, 15 }, null);
WriteResult writeResult = await connection.AppendToStreamAsync("sampleStream, ExpectedVersion.NoStream, sampleEventData);
Run Code Online (Sandbox Code Playgroud)

一切似乎工作正常,直到该AppendToStreamAsync行,抛出以下异常:

EventStore.Core.Messages.ClientMessage + WriteEventsCompleted的预期响应,接收到EventStore.Core.Messages.ClientMessage + NotHandled.

为了解决这个异常,缺少哪些神奇的咒语?

dan*_*wig 6

这里缺少两件事.首先,使用嵌入式eventstore客户端时,必须启动节点:

node.Start();
Run Code Online (Sandbox Code Playgroud)

其次,在使用连接之前,必须等待节点成为主节点.该ClusterVNode有一个名为的事件NodeStatusChanged,你可以听,并找出时,有一个主节点.以下应该有效:

ClusterVNode node = EmbeddedVNodeBuilder
    .AsSingleNode()
    .RunInMemory()
    .OnDefaultEndpoints()
    .Build();

bool isNodeMaster = false;
node.NodeStatusChanged += (sender, args) => {
    isNodeMaster = args.NewVNodeState == VNodeState.Master;
};
node.Start();

var stopwatch = new Stopwatch();
stopwatch.Start();
while (!isNodeMaster) {
    if (stopwatch.Elapsed.Seconds > 20) {
        throw new InvalidOperationException(
        "Waited too long (20 seconds) for EventStore node to become master.");
    }
    Thread.Sleep(1);
}
stopwatch.Stop();

var connection = EmbeddedEventStoreConnection.Create(node);
await connection.ConnectAsync();
var sampleEventData = new EventData(Guid.NewGuid(), "myTestEvent", false, new byte[] { 6, 10, 15 }, null);
WriteResult writeResult = await connection.AppendToStreamAsync("sampleStream, ExpectedVersion.NoStream, sampleEventData);
Run Code Online (Sandbox Code Playgroud)

秒表的东西不是必需的,但有助于while在出现问题并且节点永远不会成为主节点时突破循环.

如果在事件处理程序委托中放置断点,您将注意到node3 VNodeState秒的进展.首先,它将是VNodeState.Unknown,然后VNodeState.PreMaster,最后VNodeState.Master.

在创建连接并调用ConnectAsync()它之前,您也不需要等待节点成为主节点.但是,您需要等待节点成为主节点,然后才能调用其他任何方法AppendToStreamAsync,而不会遇到原始问题中的异常.