/// <summary>
        /// メッセージを実行します。
        /// メッセージは新しいスコープで実行されます。
        /// </summary>
        /// <param name="messagingContext">メッセージを格納したコンテキスト</param>
        public void FireMessaging(IMessagingScopeContext messagingContext)
        {
            var currentMessagingContext = (MessagingScopeContext)messagingContext;

            while (!currentMessagingContext.mDispatcherList.IsEmpty)
            {
                DispatcherItem item;
                if (currentMessagingContext.mDispatcherList.TryDequeue(out item))
                {
                    string messageName = item.EventName;
                    object param       = item.Param;
                    using (var scope = FoxpictAsyncScopedLifestyle.BeginScope(mContainer)) {
                        try {
                            LinkedList <MessageQueueItem> queue;
                            if (mSubscribeList.TryGetValue(messageName, out queue))
                            {
                                var queueArray = queue.ToArray();
                                foreach (var queueItem in queueArray)
                                {
                                    if (string.IsNullOrEmpty(queueItem.ExtentionName))
                                    {
                                        var messagecontext = new MessageContext(mContainer, param);
                                        queueItem.callback(messagecontext);
                                    }
                                    else
                                    {
                                        // 拡張機能に対するメッセージのディスパッチ
                                        var messagecontext = new MessageContext(mContainer, queueItem.ExtentionName, param);
                                        queueItem.callback(messagecontext);
                                    }
                                }
                            }
                            scope.Complete();
                        } catch (Exception expr) {
                            LOG.Error(expr, "拡張機能実行中に処理が停止しました。");
                            LOG.Error(expr.StackTrace);
                        }
                    }
                }
            }
        }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="fileMappingInfoRepository"></param>
 /// <param name="categoryRepository"></param>
 /// <param name="contentRepository"></param>
 /// <param name="thumbnailBuilder"></param>
 public FileUpdateRunner(
     IFileMappingInfoRepository fileMappingInfoRepository,
     ICategoryRepository categoryRepository,
     IContentRepository contentRepository,
     IThumbnailBuilder thumbnailBuilder,
     IAppAppMetaInfoRepository appAppMetaInfoRepository,
     ILabelRepository labelRepository,
     IMessagingScopeContext messagingScopeContext,
     IEventLogRepository eventLogRepository,
     IVirtualFileSystemService virtualFileSystemService)
 {
     this.mFileMappingInfoRepository = fileMappingInfoRepository;
     this.mCategoryRepository        = categoryRepository;
     this.mContentRepository         = contentRepository;
     this.mTumbnailBuilder           = thumbnailBuilder;
     this.mAppAppMetaInfoRepository  = appAppMetaInfoRepository;
     this.mLabelRepository           = labelRepository;
     this.mMessagingScopeContext     = messagingScopeContext;
     this.mEventLogRepository        = eventLogRepository;
     this.mVirtualFileSystemService  = virtualFileSystemService;
 }
示例#3
0
        public void Dispose()
        {
            // スコープが正常に完了している場合は、スコープ内で発行されたメッセージの処理を行う
            MessagingManager       messagingManager    = null;
            IMessagingScopeContext scopeMessageContext = null;

            try {
                if (isComplete)
                {
                    mAppDbTransaction.Commit();
                    mThumbDbTransaction.Commit();
                    messagingManager    = mScope.Container.GetInstance <MessagingManager> ();
                    scopeMessageContext = mScope.Container.GetInstance <IMessagingScopeContext> ();
                }
                else
                {
                    mAppDbTransaction.Rollback();
                    mThumbDbTransaction.Rollback();
                }
            } catch (Exception expr) {
                mLogger.Error(expr, "スコープの破棄でエラーが発生しました。");
                mLogger.Debug(expr.StackTrace);

                mAppDbTransaction.Rollback(); // ここで発生したエラーは破棄する
                mThumbDbTransaction.Rollback();
                messagingManager = null;      // 作業変数はクリアし、メッセージの処理は行わない
            } finally {
                mAppDbTransaction.Dispose();
                mThumbDbTransaction.Dispose();
                mScope.Dispose();
            }

            if (messagingManager != null)
            {
                messagingManager.FireMessaging(scopeMessageContext);
            }
        }