bool Dispatch(string routingKey, IDictionary <string, object> headers, byte[] body, ulong deliveryTag) { if (routingKey != null && routingKey.Length > 0) { string MID = MessageRoutingKey.ParseMID(routingKey); if (MID == _MID && body != null && body.Length > 0) { if (MessageRoutingKey.IsDeviceCommand(routingKey)) { string json = Encoding.UTF8.GetString(body); Command command = JsonConvert.DeserializeObject <Command>(json); CommandSubscription <Command> cs = _commandSubscriptions.Find(s => s.CommandId == command.Id); if (cs != null) { cs.CommandHandler(MID, command); lock (_modelLock) { _model.BasicAck(deliveryTag, false); } return(true); } } else if (MessageRoutingKey.IsApplicationPulse(routingKey)) { string json = Encoding.UTF8.GetString(body); Pulse pulse = JsonConvert.DeserializeObject <Pulse>(json); PulseSubscription ps = _pulseSubscriptions.Find(s => s.PulseId == pulse.PulseId); if (ps != null) { ps.PulseHandler(MID, pulse.PulseId, pulse); lock (_modelLock) { _model.BasicAck(deliveryTag, false); } return(true); } } } lock (_modelLock) { _model.BasicNack(deliveryTag, false, false); } } return(false); }
/// <summary> /// Registers a new callback method that is called when pulse from a specified pulse identifier is received. /// </summary> /// <param name="pulseId">Pulse identifier.</param> /// <param name="pulseHandler">Callback method with argument Pulse (e.g. "void MyCallback(string MID, int pulseId, Pulse pulse) { ... }"</param> public void RegisterPulseHandler(int pulseId, Action <string, int, Pulse> pulseHandler) { PulseSubscription pulseSubscription = new PulseSubscription(_MID, pulseId, pulseHandler); _pulseSubscriptions.Add(pulseSubscription); }