private void LimitedMessageHandler(IChannelHandlerContext contex, MsgProtoPacket msg) { if (msg.Subject == _subscriptionConfig.Inbox && msg.Subject == _subscriptionConfig.Subject) { if (_messageHandlerCounter < _subscriptionConfig.MaxMsg) { try { MessageHandler(msg, _messageAckCallback); _messageHandlerCounter++; } catch (Exception ex) { _logger.LogError(ex, $"[SubscriptionMessageHandler]消息处理发生异常 主题 {_subscriptionConfig.Subject}"); } } else { _unSubscriptionCallback(_subscriptionConfig); } } else { contex.FireChannelRead(msg); } }
/// <summary> /// 发送消息成功处理确认 /// </summary> /// <param name="subscriptionConfig">订阅配置</param> /// <param name="msg">消息</param> /// <param name="isAck">是否确认</param> private async Task AckAsync(STANSubscriptionConfig subscriptionConfig, MsgProtoPacket msg, bool isAck = true) { if (isAck) { var _channel = await ConnectAsync(); await _channel.WriteAndFlushAsync(new AckPacket(subscriptionConfig.AckInbox, msg.Message.Subject, msg.Message.Sequence)); } }
protected STANMsgContent PackMsgContent(MsgProtoPacket msg) { return(new STANMsgContent() { Sequence = msg.Message.Sequence, Subject = msg.Message.Subject, Reply = msg.Message.Reply, Data = msg.Message.Data.ToByteArray(), Timestamp = msg.Message.Timestamp, Redelivered = msg.Message.Redelivered, CRC32 = msg.Message.CRC32 }); }
protected override void MessageHandler(MsgProtoPacket msg, Func <STANSubscriptionConfig, MsgProtoPacket, bool, Task> ackCallback) { Task.Factory.StartNew(async _msg => { try { var current_msg = _msg as MsgProtoPacket; _messageHandler(PackMsgContent(current_msg)); await ackCallback(_subscriptionConfig, current_msg, true); } catch (Exception ex) { _logger.LogError(ex, "消息处理发生异常"); } }, msg,
protected override void ChannelRead0(IChannelHandlerContext contex, MsgProtoPacket msg) { _channelRead(contex, msg); }
protected abstract void MessageHandler(MsgProtoPacket msg, Func <STANSubscriptionConfig, MsgProtoPacket, bool, Task> ackCallback);