public void SendMessage(WireSendingMessage message, IEndpoint endpoint)
{
ZmqSocket socket;
var zmqEndpoint = (ZmqEndpoint)endpoint;
if (!_endpointsToSockets.TryGetValue(zmqEndpoint, out socket))
{
socket = CreatePushSocket(zmqEndpoint);
_endpointsToSockets.Add(zmqEndpoint, socket);
}
var status = SendStatus.TryAgain;
var wait = default(SpinWait);
bool first = true;
// _watch.Start();
var buffer = _serializer.Serialize(message.MessageData);
do
{
socket.Send(buffer, buffer.Length, SocketFlags.DontWait);
status = socket.SendStatus;
if (!first)
wait.SpinOnce();
else
first = false;
} while (status == SendStatus.TryAgain && wait.Count < 1000);
if (socket.SendStatus != SendStatus.Sent) //peer is disconnected (or underwater from too many message), raise some event?
{
_logger.Info(string.Format("disconnect of endpoint {0}", zmqEndpoint.Endpoint));
EndpointDisconnected(endpoint);
//dispose socket and allow for re-creation of socket with same endpoint; everything will get slow as hell if we continue trying? or only if high water mark
socket.Dispose();
_endpointsToSockets.Remove(zmqEndpoint);
}
}