/// <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; }
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); } }