【问题标题】:How to use the EventStore Embedded Client?如何使用 EventStore 嵌入式客户端?
【发布时间】:2015-11-09 14:34:39
【问题描述】:

似乎没有关于如何使用 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);

AppendToStreamAsync 行之前一切似乎都正常,这会引发以下异常:

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

魔法咒语缺少哪一部分来绕过这个异常?

【问题讨论】:

    标签: .net database eventstoredb


    【解决方案1】:

    这里缺少两件事。首先,在使用内嵌的eventstore客户端时,必须启动节点:

    node.Start();
    

    其次,您必须等待节点成为主节点才能使用连接。 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);
    

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

    如果您在事件处理程序委托中设置断点,您会注意到node 会经过 3 个VNodeStates。首先是VNodeState.Unknown,然后是VNodeState.PreMaster,最后是VNodeState.Master

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

    【讨论】:

    • 如果示例是针对集群的,不应该使用AsClusterMember() 而不是AsSingleNode()吗?
    • 知道为什么我在启动节点嵌入式 api 时无法浏览流吗?我在端口 2113 上设置了外部 http,但 localhost:2113 没有打开。
    • 可以使用 node.StartAndWaitUntilReady().Wait();并避免所有状态检查部分...不要被类名所迷惑,示例是单节点,加入集群必须使用 AsClusterMember(clusterSize)。 Reference
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    相关资源
    最近更新 更多