【发布时间】:2014-05-08 02:13:12
【问题描述】:
我正在尝试使用 NetMQ 在两个应用程序之间实现一个简单的消息传递(下面对我要实现的目标进行了稍微详细的描述)。
经过一些试验和错误后,我发现我不能在 Connect/Bind 调用后立即发送或接收消息,因为它们是非阻塞的,即使连接尚未建立,它们实际上也会返回。
现在我用 Thread.Sleep() 解决了这个问题,但这对它的品味很差,而且绝对不适合生产系统。
所以问题是,在 NetMQ/ZeroMQ 中应该如何做呢?
客户端示例:
using (NetMQContext ctx = NetMQContext.Create())
{
using (var client = ctx.CreatePushSocket())
{
client.Connect("tcp://127.0.0.1:5555");
Thread.Sleep(100); // wait for connection
for (int i = 0; i < 5; i++)
{
client.Send("test " + i , true);
}
}
}
}
服务器示例:
using (NetMQContext ctx = NetMQContext.Create())
{
using (var server = ctx.CreatePullSocket())
{
server.Bind("tcp://127.0.0.1:5555");
Thread.Sleep(100); // wait for connection
while (true)
{
var str = server.ReceiveString();
Console.Out.WriteLine(str);
Thread.Sleep(60*1000); // do msg processing
}
}
}
描述我想要达到的目标:
客户端 - 将消息发送到单个服务器。当服务器不可用时,客户端不应阻塞也不应丢弃消息。客户端可以随时离线/在线。
服务器 - 从单个客户端接收消息。服务器阻塞,直到收到消息。服务器需要对消息进行长时间的处理,并且在处理时不应丢失任何其他消息。服务器可以随时下线/上线。
【问题讨论】:
-
netmq网站上的例子没有将
true传入Send。