1

タイムアウト メッセージが受信されるまで、指定されたタイプの受信メッセージを追跡するためにサガを使用するエージェントがあります。Timeout ハンドラーには、次のものがあります。

public override void Timeout(object state)
        {
            // If Data.IsNull: Do nothing!!! Report to log only.
            Logger.Debug("=========================================================================");
            Logger.Debug(string.Format("Timeout message received. State: {0}.", state.ToString()));

            QuickBatch qbBuilder = new QuickBatch();
            // Create new message and publish it
            BankRequestBatchClosed eventMessage = Bus.CreateInstance<BankRequestBatchClosed>();

            eventMessage.UniqueBatchIdentifier = qbBuilder.GenerateUniqueBatchIdentifier(QuickBatch.QB_BATCHTYPE_CC);
            eventMessage.ScheduleBatchID = this.Data.ScheduleBatchID;
            eventMessage.EventDate = DateTime.Now;
            eventMessage.EventID = Guid.NewGuid();
            eventMessage.TransactionItems = this.Data.PaymentRequestedTransactionItems;

            Logger.Debug("=========================================================================");
            Logger.Debug(string.Format("Timeout method about to send BankRequestBatchClosed message. UniqueBatchIdentifier: {0}",eventMessage.UniqueBatchIdentifier));

            Bus.Publish(eventMessage);
            Complete();
        }

TransactionItems は ICollection です

以下は TransactionDetail クラスです。

   [Serializable]
    public class TransactionDetail
    {
        // Guid needed for NHibernate to store it in database. All
        // member variables are virtual for the same reason.
        public virtual Guid Id { get; set; }
        public virtual Int32 ScheduleBatchID { get; set; }
        public virtual Int32 PseudoSagaID { get; set; }
        public virtual String CreditCardNumber { get; set; }
        public virtual String ExpiryDate { get; set; }

        public virtual String AccountNumber { get; set; }
        public virtual String BSB { get; set; }

        public virtual Decimal Amount { get; set; }
        public virtual Int32 Firm_fk { get; set; }
        public virtual String FirmName { get; set; }
        public virtual TransactionType PaymentType { get; set; }
        // transaction number, max 15 chars, to use one of the following:
        public virtual int ApplicationPaymentInfo_fk { get; set; }
        public virtual BankRequestResponseSagaBase Parent { get; set; }
    }

サブスクリプションが設定されていない場合、Bus.Publish() 呼び出しは問題なく実行されます。別のサービスを購読している場合、次のエラー メッセージが表示されます。

タイプ 'System.StackOverflowException' の未処理の例外が mscorlib.dll で発生しました

オーバーフローに関するこれ以上の情報はありません: {現在のスレッドがスタック オーバーフロー状態にあるため、式を評価できません。}

私は自分の SagaPersister、Profile、および SagaRegistry を持っていますが、それらがこの問題に関連しているかどうかはわかりませんが、必要に応じて提供できます。

4

2 に答える 2

2

ここで少し怪しいと思われるのは、TransactionDetail オブジェクトの BankRequestResponseSagaBase Parent プロパティです。参照にループがあり、saga パーシスタが爆発する原因になっている可能性があります。

于 2012-01-09T12:56:38.143 に答える