/// <summary> /// 使用专用的Confirm模式,每Publish消息一次就确认一次 /// </summary> /// <param name="publishActions">要发布消息的具体方法集,每个方法只有一次Publish的调用</param> /// <returns>每个发布方法按序生成(从1开始)的发布成功标识</returns> public SortedDictionary <ulong, bool> PublishConfirm(params Action <IMQPublisher>[] publishActions) { var confirmChannel = con.CreateModel(); IMQPublisher confirmPublisher = new RabbitMQPublisher(() => confirmChannel, setExistsQueue, ManagerInstance.QueueDeclare); confirmChannel.ConfirmSelect(); SortedDictionary <ulong, bool> dicValues = new SortedDictionary <ulong, bool>(); try { foreach (var action in publishActions) { //当Channe关闭时直接退出 if (confirmChannel.IsClosed) { break; } var seqNo = confirmChannel.NextPublishSeqNo; if (!dicValues.ContainsKey(seqNo)) { dicValues.Add(seqNo, false); } try { action.Invoke(confirmPublisher); dicValues[dicValues.Keys.Max()] = confirmChannel.WaitForConfirms(); } catch (AlreadyClosedException) { break; } catch (OperationInterruptedException) { break; } catch (Exception ex) { Console.WriteLine("PublishConfirm方法使用Confirm模式发送消息时发生异常:{0},StackTrace:{1}", ex.Message, ex.StackTrace); } } } finally { confirmPublisher.Dispose(); } return(dicValues); }
/// <summary> /// 使用专用的Confirm模式,多次Publish消息后。全部批量确认 /// </summary> /// <param name="publishActions">要发布消息的具体方法集,每个方法只有一次Publish的调用</param> /// <returns>已发布成功的方法序号(从1开始),以及有异常时的相应描述</returns> public Tuple <ulong, Exception> PublishConfirms(params Action <IMQPublisher>[] publishActions) { var confirmChannel = con.CreateModel(); IMQPublisher confirmPublisher = new RabbitMQPublisher(() => confirmChannel, setExistsQueue, ManagerInstance.QueueDeclare); confirmChannel.ConfirmSelect(); Tuple <ulong, Exception> rtnValue; try { foreach (var action in publishActions) { action.Invoke(confirmPublisher); } confirmChannel.WaitForConfirmsOrDie(); rtnValue = new Tuple <ulong, Exception>(confirmChannel.NextPublishSeqNo - 1, null); } catch (AlreadyClosedException ex) { rtnValue = new Tuple <ulong, Exception>(Math.Max(0, confirmChannel.NextPublishSeqNo - 2), ex); } catch (OperationInterruptedException ex) { rtnValue = new Tuple <ulong, Exception>(Math.Max(0, confirmChannel.NextPublishSeqNo - 2), ex); } catch (System.IO.IOException ex) { rtnValue = new Tuple <ulong, Exception>(Math.Max(0, confirmChannel.NextPublishSeqNo - 2), ex); } catch (Exception ex) { //publishActions内的异常,这时还未调用Publish故计算器不会预加1 rtnValue = new Tuple <ulong, Exception>(confirmChannel.NextPublishSeqNo - 1, ex); } finally { confirmPublisher.Dispose(); } return(rtnValue); }