EventStore嵌入式客户端如何使用?
How to use the EventStore Embedded Client?
似乎没有关于如何使用 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
行之前一切似乎都正常,它抛出以下异常:
Expected response of EventStore.Core.Messages.ClientMessage+WriteEventsCompleted, received EventStore.Core.Messages.ClientMessage+NotHandled instead.
缺少魔法咒语的哪一部分来绕过这个异常?
这里缺少两件事。首先,使用嵌入式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 VNodeState
秒。首先是 VNodeState.Unknown
,然后是 VNodeState.PreMaster
,最后是 VNodeState.Master
。
您也不应在创建连接并对其调用 ConnectAsync()
之前等待节点成为主节点。但是,您需要等待节点成为主节点,然后才能在其上调用任何其他方法,例如 AppendToStreamAsync
而不会 运行 进入原始问题中的异常。
似乎没有关于如何使用 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
行之前一切似乎都正常,它抛出以下异常:
Expected response of EventStore.Core.Messages.ClientMessage+WriteEventsCompleted, received EventStore.Core.Messages.ClientMessage+NotHandled instead.
缺少魔法咒语的哪一部分来绕过这个异常?
这里缺少两件事。首先,使用嵌入式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 VNodeState
秒。首先是 VNodeState.Unknown
,然后是 VNodeState.PreMaster
,最后是 VNodeState.Master
。
您也不应在创建连接并对其调用 ConnectAsync()
之前等待节点成为主节点。但是,您需要等待节点成为主节点,然后才能在其上调用任何其他方法,例如 AppendToStreamAsync
而不会 运行 进入原始问题中的异常。