我有其产生在结构的PUB插座消息发布服务器类,用下面的代码阻断:NetMQ订户与发布的消息
this.context = NetMQContext.Create();
this.pubSocket = this.context.CreatePublisherSocket();
var portNumber = this.installerSettings.PublisherPort;
this.pubSocket.Bind("tcp://127.0.0.1:" + portNumber);
发送使用messagePublishingServer.Publish(message)
消息执行:
this.pubSocket.SendMoreFrame(string.Empty).SendFrame(message);
以下xBehave测试...
[Scenario]
public void PublishMessageScenario()
{
MessagePublishingServer messagePublishingServer = null;
NetMQContext context;
NetMQ.Sockets.SubscriberSocket subSocket = null;
string receivedMessage = null;
"Given a running message publishing server"._(() =>
{
var installerSettingsManager = A.Fake<IInstallerSettingsManager>();
var settings = new InstallerSettings { PublisherPort = "5348" };
A.CallTo(() => installerSettingsManager.Settings).Returns(settings);
messagePublishingServer = new MessagePublishingServer(installerSettingsManager);
});
"And a subscriber connected to the publishing server"._(() =>
{
context = NetMQContext.Create();
subSocket = context.CreateSubscriberSocket();
subSocket.Options.ReceiveHighWatermark = 1000;
subSocket.Connect("tcp://127.0.0.1:5348");
subSocket.Subscribe(string.Empty);
});
"When publishing a message"._(() =>
{
messagePublishingServer.Publish("test message");
// Receive the topic
subSocket.ReceiveFrameString();
// and the message
receivedMessage = subSocket.ReceiveFrameString();
});
"Then the subscriber must have received it"._(() =>
{
receivedMessage.Should().NotBeNullOrEmpty();
receivedMessage.Should().Be("test message");
});
}
... bl在我发现意想不到的第一个subSocket.ReceiveFrameString()
。订阅者套接字是否应该在发布接收消息之前排队发布的消息?
喂somdoron,在'subSocket.Connect(“tcp://127.0.0.1:5348”)''后面加入'Thread.Sleep(100)'解决了这个问题。我有这样的印象,即从Connect调用返回时,套接字将被连接 - 显然不是。 – Andrey