.net 如何使用EventStore嵌入式客户端?
似乎没有关于如何使用EventStore.client.Embedded nuget包设置、运行和连接嵌入式EventStore客户端的文档。使用以下代码:.net 如何使用EventStore嵌入式客户端?,.net,database,eventstoredb,.net,Database,Eventstoredb,似乎没有关于如何使用EventStore.client.Embedded nuget包设置、运行和连接嵌入式EventStore客户端的文档。使用以下代码: ClusterVNode node = EmbeddedVNodeBuilder .AsSingleNode() .RunInMemory() .OnDefaultEndpoints() .Build(); var connection = EmbeddedEventStoreConnection.Crea
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
为了避开这个例外,魔法咒语缺少了哪一部分?这里缺少了两件事。首先,使用嵌入式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
循环
如果在事件处理程序委托中放置一个断点,您将注意到节点
通过3个VNodeState
s。首先是VNodeState.Unknown
,然后是VNodeState.PreMaster
,最后是VNodeState.Master
在创建连接并对其调用
ConnectAsync()
之前,您不需要等待节点成为主节点。但是,您需要等待节点成为主节点,然后才能对其调用任何其他方法,如AppendToStreamAsync
,而不会在原始问题中遇到异常 如果示例是针对集群的,那么它不应该使用AsClusterMember()
而不是AsSingleNode()
?知道为什么启动节点嵌入api时不能浏览流吗?我在端口2113上设置了外部http,但localhost:2113未打开。您可以使用node.StartAndWaitUntilReady().Wait();避免所有的状态检查部分。。。不要被类名所愚弄,例如单节点,要加入集群必须使用AsClusterMember(clusterSize)。