private void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += SbmqmDomain_AssemblyResolve; _monitorState = new SbmqmMonitorState(); Config = SystemConfig.Load(); Config.StartCount += 1; Config.Save(); CreateServiceBusManager(Config.ServiceBus, Config.ServiceBusVersion, Config.ServiceBusQueueType); _history = new CommandHistoryManager(Config); AppInfo = new ApplicationInfo(Config.Id, Assembly.GetEntryAssembly()); }
private void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += SbmqmDomain_AssemblyResolve; _monitorState = new SbmqmMonitorState(); Config = SystemConfig.Load(); Config.StartCount += 1; Config.Save(); // Check if we still have the ServiceBus Adapter available var availMgrs = ServiceBusFactory.AvailableServiceBusManagers(); if (!availMgrs.Any(mgr => mgr.Name == Config.ServiceBus && mgr.Version == Config.ServiceBusVersion && mgr.QueueType == Config.ServiceBusQueueType)) { // Check if we have any other versions available var m = availMgrs.FirstOrDefault(mgr => mgr.Name == Config.ServiceBus && mgr.QueueType == Config.ServiceBusQueueType); if (m != null) { Config.CurrentServer.ServiceBusVersion = m.Version; } else // Check if we have this ServiceBus Type { m = availMgrs.FirstOrDefault(mgr => mgr.Name == Config.ServiceBus); if (m != null) { Config.CurrentServer.ServiceBusQueueType = m.QueueType; Config.CurrentServer.ServiceBusVersion = m.Version; } else { throw new NotSupportedException("Not Supported Service Bus type '{0}', Please re-install Service Bus MQ Manager.".With(Config.ServiceBus)); } } } CreateServiceBusManager(Config.ServiceBus, Config.ServiceBusVersion, Config.ServiceBusQueueType); _history = new CommandHistoryManager(Config); AppInfo = new ApplicationInfo(Config.Id, Assembly.GetEntryAssembly()); }
private void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += SbmqmDomain_AssemblyResolve; _monitorState = new SbmqmMonitorState(); Config = SystemConfig.Load(); Config.StartCount += 1; _mgr = ServiceBusFactory.CreateManager(Config.MessageBus, Config.MessageBusQueueType); _mgr.ErrorOccured += System_ErrorOccured; _mgr.ItemsChanged += System_ItemsChanged; _mgr.Initialize(Config.MonitorServer, Config.MonitorQueues.Select(mq => new Queue(mq.Name, mq.Type, mq.Color)).ToArray(), _monitorState); CanSendCommand = (_mgr as ISendCommand) != null; CanViewSubscriptions = (_mgr as IViewSubscriptions) != null; _history = new CommandHistoryManager(Config); AppInfo = new ApplicationInfo(Config.Id, Assembly.GetEntryAssembly()); }
public bool RefreshUnprocessedQueueItemList() { if( !_monitorState.MonitorQueueType.Any(mq => mq) || _mgr.MonitorQueues.Length == 0 ) return false; List<QueueItem> items = new List<QueueItem>(); // TODO: Solve why we can not iterate thru Remote MQ, // both GetMessageEnumerator2() and GetAllMessages() should be available for // Remote computer and direct format name, but returns zero (0) messages in some cases //if( !Tools.IsLocalHost(_serverName) ) // return; bool changedItemsCount = false; var monitorStatesWhenFetch = new SbmqmMonitorState(_monitorState.MonitorQueueType); // Removed as when changing QTs in UI this would change list and throw a modification exception in Manager. // Creating an array is not as resource efficient, but it works. //IEnumerable<QueueItem> currentItems = _items.AsEnumerable<QueueItem>(); foreach( QueueType t in _queueTypeValues ) { if( _monitorState.IsMonitoring(t) ) { var r = _mgr.GetUnprocessedMessages(t, _items.ToArray()); items.AddRange(r.Items); int typeIndex = (int)t; if( _unprocessedItemsCount[typeIndex] != r.Count ) changedItemsCount = true; _unprocessedItemsCount[typeIndex] = r.Count; } } // Oldest first if( items.Count > 1 ) items.Sort((a, b) => a.ArrivedTime.CompareTo(b.ArrivedTime)); bool changed = false; lock( _itemsLock ) { // If changed Monitor Queues while fetching remove then from result. List<QueueType> removedQueueTypes = new List<QueueType>(4); foreach( QueueType t in _queueTypeValues ) { if( !_monitorState.IsMonitoring(t) && monitorStatesWhenFetch.IsMonitoring(t) ) { removedQueueTypes.Add(t); } } if( removedQueueTypes.Any() ) items = items.Where(i => !removedQueueTypes.Any( x => x == i.Queue.Type ) ).ToList(); // Add new items foreach( var itm in items ) { var existingItem = _items.SingleOrDefault(i => i.Id == itm.Id); if( existingItem == null ) { _items.Insert(0, new QueueItemViewModel(itm, _mgr.MessagesHasMilliSecondPrecision)); if( !changed ) changed = true; } else if( existingItem.Processed ) { // It has been retried, move to top _items.Remove(existingItem); existingItem.Processed = false; _items.Insert(0, existingItem); if( !changed ) changed = true; } } // Mark removed as deleted messages foreach( var itm in _items ) if( !items.Any(i2 => i2.Id == itm.Id) ) { if( !itm.Processed ) { itm.Processed = true; if( !changed ) changed = true; } } } return changed || changedItemsCount; }
private void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += SbmqmDomain_AssemblyResolve; _monitorState = new SbmqmMonitorState(); Config = SystemConfig.Load(); Config.StartCount += 1; Config.Save(); // Check if we still have the ServiceBus Adapter available var availMgrs = ServiceBusFactory.AvailableServiceBusManagers(); if( !availMgrs.Any(mgr => mgr.Name == Config.ServiceBus && mgr.Version == Config.ServiceBusVersion && mgr.QueueType == Config.ServiceBusQueueType) ) { // Check if we have any other versions available var m = availMgrs.FirstOrDefault(mgr => mgr.Name == Config.ServiceBus && mgr.QueueType == Config.ServiceBusQueueType); if( m != null ) Config.CurrentServer.ServiceBusVersion = m.Version; else { // Check if we have this ServiceBus Type m = availMgrs.FirstOrDefault(mgr => mgr.Name == Config.ServiceBus); if( m != null ) { Config.CurrentServer.ServiceBusQueueType = m.QueueType; Config.CurrentServer.ServiceBusVersion = m.Version; } else throw new NotSupportedException("Not Supported Service Bus type '{0}', Please re-install Service Bus MQ Manager.".With(Config.ServiceBus)); } } CreateServiceBusManager(Config.ServiceBus, Config.ServiceBusVersion, Config.ServiceBusQueueType); _history = new CommandHistoryManager(Config); AppInfo = new ApplicationInfo(Config.Id, Assembly.GetEntryAssembly()); }
private void Initialize() { AppDomain.CurrentDomain.AssemblyResolve += SbmqmDomain_AssemblyResolve; _monitorState = new SbmqmMonitorState(); Config = SystemConfig.Load(); Config.StartCount += 1; _mgr = ServiceBusFactory.CreateManager(Config.MessageBus, Config.MessageBusQueueType); _mgr.ErrorOccured += System_ErrorOccured; _mgr.WarningOccured += System_WarningOccured; _mgr.ItemsChanged += System_ItemsChanged; _mgr.Initialize(Config.MonitorServer, Config.MonitorQueues.Select(mq => new Queue(mq.Name, mq.Type, mq.Color)).ToArray(), _monitorState); CanSendCommand = ( _mgr as ISendCommand ) != null; CanViewSubscriptions = ( _mgr as IViewSubscriptions ) != null; _history = new CommandHistoryManager(Config); AppInfo = new ApplicationInfo(Config.Id, Assembly.GetEntryAssembly()); }
public bool RefreshUnprocessedQueueItemList() { _log.Debug("* Refresh Unprocessed Queue Items, " + DateTime.Now.ToString()); if( !_monitorState.MonitorQueueType.Any(mq => mq) || _mgr.MonitorQueues.Length == 0 ) return false; List<QueueItem> items = new List<QueueItem>(); // TODO: Solve why we can not iterate thru Remote MQ, // both GetMessageEnumerator2() and GetAllMessages() should be available for // Remote computer and direct format name, but returns zero (0) messages in some cases //if( !Tools.IsLocalHost(_serverName) ) // return; bool changedItemsCount = false; var monitorStatesWhenFetch = new SbmqmMonitorState(_monitorState.MonitorQueueType); List<string> unchangedQueues = new List<string>(); // Temp until we have a more proper way to Discover if Error queues are built-in with normal queues if( !_monitorState.IsMonitoring(QueueType.Error) ) _unprocessedItemsCount[(int)QueueType.Error] = 0; // Removed as when changing QTs in UI this would change list and throw a modification exception in Manager. // Creating an array is not as resource efficient, but it works. //IEnumerable<QueueItem> currentItems = _items.AsEnumerable<QueueItem>(); foreach( QueueType t in _queueTypeValues ) { if( _monitorState.IsMonitoring(t) ) { var r = _mgr.GetUnprocessedMessages(new QueueFetchUnprocessedMessagesRequest(t, _items.ToArray(), GetUnprocessedItemsCount(t))); if( r.Status == QueueFetchResultStatus.ConnectionFailed ) break; if( r.Status == QueueFetchResultStatus.NotChanged ) { unchangedQueues.AddRange(_mgr.MonitorQueues.Where(q => q.Type == t).Select(q => q.Name)); continue; } items.AddRange(r.Items); int typeIndex = (int)t; if( _unprocessedItemsCount[typeIndex] != r.Count ) changedItemsCount = true; _unprocessedItemsCount[typeIndex] = r.Count; if( t != QueueType.Error && items.Any(i => i.Queue.Type == QueueType.Error) ) { _unprocessedItemsCount[(int)QueueType.Error] += (uint)items.Where(i => i.Queue.Type == QueueType.Error).Count(); changedItemsCount = true; } } } // Oldest first if( items.Count > 1 ) items.Sort((a, b) => a.ArrivedTime.CompareTo(b.ArrivedTime)); bool changed = false; lock( _itemsLock ) { // If changed Monitor Queues while fetching remove then from result. List<QueueType> removedQueueTypes = new List<QueueType>(4); foreach( QueueType t in _queueTypeValues ) { if( !_monitorState.IsMonitoring(t) && monitorStatesWhenFetch.IsMonitoring(t) ) { removedQueueTypes.Add(t); } } if( removedQueueTypes.Any() ) items = items.Where(i => !removedQueueTypes.Any(x => x == i.Queue.Type)).ToList(); // Add new items foreach( var itm in items ) { var existingItems = _items.Where(i => i.Id == itm.Id).ToArray(); if( !existingItems.Any() ) { _items.Insert(0, new QueueItemViewModel(itm, _mgr.MessagesHasMilliSecondPrecision)); if( !changed ) changed = true; } else { foreach( var existingItem in existingItems ) { if( itm.Queue.Name != existingItem.Queue.Name /*&& !existingItem.Processed*/ ) { // Moved queue if( !_items.Any(i => i.MessageQueueItemId == itm.MessageQueueItemId) ) { existingItem.Processed = true; _items.Insert(0, new QueueItemViewModel(itm, _mgr.MessagesHasMilliSecondPrecision)); if( !changed ) changed = true; } } else if( itm.Queue.Name == existingItem.Queue.Name && existingItem.Processed ) { // It has been retried, move to top _items.Remove(existingItem); existingItem.Processed = false; _items.Insert(0, existingItem); if( !changed ) changed = true; } else if( itm.Queue.Name == existingItem.Queue.Name && !existingItem.Processed ) { // Processed, but not yet been marked as processed _items.Remove(existingItem); _items.Insert(0, existingItem); if( !changed ) changed = true; } else { _log.Trace(" **** Unhandled new item state, " + itm.Id); } } } } // Mark removed as deleted messages foreach( var itm in _items ) if( !unchangedQueues.Contains(itm.Queue.Name) ) if( !items.Any(i2 => i2.Id == itm.Id) ) { if( !itm.Processed ) { itm.Processed = true; if( !changed ) changed = true; } } } return changed || changedItemsCount; }
public bool RefreshUnprocessedQueueItemList() { if (!_monitorState.MonitorQueueType.Any(mq => mq) || _mgr.MonitorQueues.Length == 0) { return(false); } List <QueueItem> items = new List <QueueItem>(); // TODO: Solve why we can not iterate thru Remote MQ, // both GetMessageEnumerator2() and GetAllMessages() should be available for // Remote computer and direct format name, but returns zero (0) messages in some cases //if( !Tools.IsLocalHost(_serverName) ) // return; bool changedItemsCount = false; var monitorStatesWhenFetch = new SbmqmMonitorState(_monitorState.MonitorQueueType); // Removed as when changing QTs in UI this would change list and throw a modification exception in Manager. // Creating an array is not as resource efficient, but it works. //IEnumerable<QueueItem> currentItems = _items.AsEnumerable<QueueItem>(); foreach (QueueType t in _queueTypeValues) { if (_monitorState.IsMonitoring(t)) { var r = _mgr.GetUnprocessedMessages(t, _items.ToArray()); items.AddRange(r.Items); int typeIndex = (int)t; if (_unprocessedItemsCount[typeIndex] != r.Count) { changedItemsCount = true; } _unprocessedItemsCount[typeIndex] = r.Count; } } // Oldest first if (items.Count > 1) { items.Sort((a, b) => a.ArrivedTime.CompareTo(b.ArrivedTime)); } bool changed = false; lock ( _itemsLock ) { // If changed Monitor Queues while fetching remove then from result. List <QueueType> removedQueueTypes = new List <QueueType>(4); foreach (QueueType t in _queueTypeValues) { if (!_monitorState.IsMonitoring(t) && monitorStatesWhenFetch.IsMonitoring(t)) { removedQueueTypes.Add(t); } } if (removedQueueTypes.Any()) { items = items.Where(i => !removedQueueTypes.Any(x => x == i.Queue.Type)).ToList(); } // Add new items foreach (var itm in items) { var existingItem = _items.SingleOrDefault(i => i.Id == itm.Id); if (existingItem == null) { _items.Insert(0, new QueueItemViewModel(itm, _mgr.MessagesHasMilliSecondPrecision)); if (!changed) { changed = true; } } else if (existingItem.Processed) { // It has been retried, move to top _items.Remove(existingItem); existingItem.Processed = false; _items.Insert(0, existingItem); if (!changed) { changed = true; } } } // Mark removed as deleted messages foreach (var itm in _items) { if (!items.Any(i2 => i2.Id == itm.Id)) { if (!itm.Processed) { itm.Processed = true; if (!changed) { changed = true; } } } } } return(changed || changedItemsCount); }
public bool RefreshUnprocessedQueueItemList() { _log.Debug("* Refresh Unprocessed Queue Items, " + DateTime.Now.ToString()); if (!_monitorState.MonitorQueueType.Any(mq => mq) || _mgr.MonitorQueues.Length == 0) { return(false); } List <QueueItem> items = new List <QueueItem>(); // TODO: Solve why we can not iterate thru Remote MQ, // both GetMessageEnumerator2() and GetAllMessages() should be available for // Remote computer and direct format name, but returns zero (0) messages in some cases //if( !Tools.IsLocalHost(_serverName) ) // return; bool changedItemsCount = false; var monitorStatesWhenFetch = new SbmqmMonitorState(_monitorState.MonitorQueueType); List <string> unchangedQueues = new List <string>(); // Temp until we have a more proper way to Discover if Error queues are built-in with normal queues if (!_monitorState.IsMonitoring(QueueType.Error)) { _unprocessedItemsCount[(int)QueueType.Error] = 0; } // Removed as when changing QTs in UI this would change list and throw a modification exception in Manager. // Creating an array is not as resource efficient, but it works. //IEnumerable<QueueItem> currentItems = _items.AsEnumerable<QueueItem>(); foreach (QueueType t in _queueTypeValues) { if (_monitorState.IsMonitoring(t)) { var r = _mgr.GetUnprocessedMessages(new QueueFetchUnprocessedMessagesRequest(t, _items.ToArray(), GetUnprocessedItemsCount(t))); if (r.Status == QueueFetchResultStatus.ConnectionFailed) { break; } if (r.Status == QueueFetchResultStatus.NotChanged) { unchangedQueues.AddRange(_mgr.MonitorQueues.Where(q => q.Type == t).Select(q => q.Name)); continue; } items.AddRange(r.Items); int typeIndex = (int)t; if (_unprocessedItemsCount[typeIndex] != r.Count) { changedItemsCount = true; } _unprocessedItemsCount[typeIndex] = r.Count; if (t != QueueType.Error && items.Any(i => i.Queue.Type == QueueType.Error)) { _unprocessedItemsCount[(int)QueueType.Error] += (uint)items.Where(i => i.Queue.Type == QueueType.Error).Count(); changedItemsCount = true; } } } // Oldest first if (items.Count > 1) { items.Sort((a, b) => a.ArrivedTime.CompareTo(b.ArrivedTime)); } bool changed = false; lock ( _itemsLock ) { // If changed Monitor Queues while fetching remove then from result. List <QueueType> removedQueueTypes = new List <QueueType>(4); foreach (QueueType t in _queueTypeValues) { if (!_monitorState.IsMonitoring(t) && monitorStatesWhenFetch.IsMonitoring(t)) { removedQueueTypes.Add(t); } } if (removedQueueTypes.Any()) { items = items.Where(i => !removedQueueTypes.Any(x => x == i.Queue.Type)).ToList(); } // Add new items foreach (var itm in items) { var existingItems = _items.Where(i => i.Id == itm.Id).ToArray(); if (!existingItems.Any()) { _items.Insert(0, new QueueItemViewModel(itm, _mgr.MessagesHasMilliSecondPrecision)); if (!changed) { changed = true; } } else { foreach (var existingItem in existingItems) { if (itm.Queue.Name != existingItem.Queue.Name /*&& !existingItem.Processed*/) // Moved queue { if (!_items.Any(i => i.MessageQueueItemId == itm.MessageQueueItemId)) { existingItem.Processed = true; _items.Insert(0, new QueueItemViewModel(itm, _mgr.MessagesHasMilliSecondPrecision)); if (!changed) { changed = true; } } } else if (itm.Queue.Name == existingItem.Queue.Name && existingItem.Processed) { // It has been retried, move to top _items.Remove(existingItem); existingItem.Processed = false; _items.Insert(0, existingItem); if (!changed) { changed = true; } } else if (itm.Queue.Name == existingItem.Queue.Name && !existingItem.Processed) { // Processed, but not yet been marked as processed _items.Remove(existingItem); _items.Insert(0, existingItem); if (!changed) { changed = true; } } else { _log.Trace(" **** Unhandled new item state, " + itm.Id); } } } } // Mark removed as deleted messages foreach (var itm in _items) { if (!unchangedQueues.Contains(itm.Queue.Name)) { if (!items.Any(i2 => i2.Id == itm.Id)) { if (!itm.Processed) { itm.Processed = true; if (!changed) { changed = true; } } } } } } return(changed || changedItemsCount); }