2013-04-01 1073 views
1

无论何时部署我们的组件,我们都会收到以下异常。有时组件本身不会启动,有时服务控制台可能会启动,但服务不会处理任何消息。 错误非常简单。还有一个HttpListener仍在监听前缀。System.Net.HttpListenerException:无法侦听前缀'xxxx',因为它与机器上现有的注册冲突

NServiceBus.Hosting.GenericHost System.Exception: Failed to start listener for http://localhost/products/ make sure that you have admin priviliges ---> System.Net.HttpListenerException: Failed to listen on prefix 'http://localhost:80/products/' because it conflicts with an existing registration on the machine. 
    at System.Net.HttpListener.AddAllPrefixes() 
    at System.Net.HttpListener.Start() 
    at NServiceBus.Gateway.Channels.Http.HttpChannelReceiver.Start(String address, Int32 numWorkerThreads) in c:\BuildAgent\work\nsb.master_6\src\gateway\NServiceBus.Gateway\Channels\Http\HttpChannelReceiver.cs:line 30 
    --- End of inner exception stack trace --- 
    at NServiceBus.Gateway.Channels.Http.HttpChannelReceiver.Start(String address, Int32 numWorkerThreads) in c:\BuildAgent\work\nsb.master_6\src\gateway\NServiceBus.Gateway\Channels\Http\HttpChannelReceiver.cs:line 37 
    at NServiceBus.Gateway.Receiving.GatewayReceiver.Start(Address localAddress) in c:\BuildAgent\work\nsb.master_6\src\gateway\NServiceBus.Gateway\Receiving\GatewayReceiver.cs:line 38 
    at System.Collections.Generic.List`1.ForEach(Action`1 action) 
    at NServiceBus.Unicast.UnicastBus.NServiceBus.IStartableBus.Start(Action startupAction) in c:\BuildAgent\work\nsb.master_6\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 867 
    at NServiceBus.Hosting.GenericHost.Start() in c:\BuildAgent\work\nsb.master_6\src\hosting\NServiceBus.Hosting\GenericHost.cs:line 34 

当我们进行深度分析。

  1. 当您运行NServiceBus.Master 简介
  2. 这个问题只在发生,只要您从服务控制台执行重新启动服务这个问题只在发生
  3. 没有不管你有多少WorkerThreads运行

当我们更深入地读取NSB代码时,我们发现HttpListener在对象Dispose期间被关闭,这令我们感到困惑。除此之外,当你停止服务时,整个进程本身就会被终止,所以机器上不会有任何对象来监听给定的URL前缀。但是,我们错了。当我们分析很多闭包时,我们发现NServinceBus.Host进程仍然在运行,即使Service-Console认为服务已经停止。每当我们停止服务控制台上的服务时,进程在机器上仍然活动&完全关闭需要相当长的时间。因此,当我们执行重新启动时,当前服务有一个以上的进程实例 - 尝试启动另一个实例仍然试图停止。我们确认重启过程会抛出上述异常。

我们把关闭过程的转储。我们发现,虽然服务控制台显示状态为已停止,但后台线程仍处于活动状态。 Dispose期间有很多锁/ ObjWait。肯定已停止的服务尚未关闭HttpListener对象。

 Child SP    IP Call Site 
000000001f19e048 00000000778818ca [GCFrame: 000000001f19e048] 
000000001f19e118 00000000778818ca [HelperMethodFrame_1OBJ: 000000001f19e118] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object) 
000000001f19e230 000007fe99d57ccb System.Transactions.CommittableTransaction.Commit() 
000000001f19e2d0 000007fe99d577df System.Transactions.TransactionScope.InternalDispose() 
000000001f19e3c0 000007fe99d56f1c System.Transactions.TransactionScope.Dispose() 
000000001f19e590 000007fe99c4a3b5 NServiceBus.Utils.TransactionWrapper.RunInTransaction(System.Action, System.Transactions.IsolationLevel, System.TimeSpan) 
000000001f19e610 000007fe99c45b2b NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.Process() 
000000001f19e680 000007fe99c455cb NServiceBus.Utils.WorkerThread.Loop() 
000000001f19e6d0 000007fef6fdf8a5 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
000000001f19e830 000007fef6fdf609 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
000000001f19e860 000007fef6fdf5c7 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
000000001f19e8b0 000007fef6ff2d21 System.Threading.ThreadHelper.ThreadStart() 
000000001f19ebc8 000007fef81cf713 [GCFrame: 000000001f19ebc8] 
000000001f19eef8 000007fef81cf713 [DebuggerU2MCatchHandlerFrame: 000000001f19eef8] 
000000001f19f0d8 000007fef81cf713 [ContextTransitionFrame: 000000001f19f0d8] 
000000001f19f2c8 000007fef81cf713 [DebuggerU2MCatchHandlerFrame: 000000001f19f2c8] 

我们发现,在HttpListener活跃&倾听。

 Child SP    IP Call Site 
000000002038e2f8 000000007788135a [InlinedCallFrame: 000000002038e2f8] System.Net.UnsafeNclNativeMethods+HttpApi.HttpReceiveHttpRequest(System.Runtime.InteropServices.CriticalHandle, UInt64, UInt32, HTTP_REQUEST*, UInt32, UInt32*, System.Threading.NativeOverlapped*) 
000000002038e2f8 000007fe99c6a2f8 [InlinedCallFrame: 000000002038e2f8] System.Net.UnsafeNclNativeMethods+HttpApi.HttpReceiveHttpRequest(System.Runtime.InteropServices.CriticalHandle, UInt64, UInt32, HTTP_REQUEST*, UInt32, UInt32*, System.Threading.NativeOverlapped*) 
000000002038e2b0 000007fe99c6a2f8 DomainBoundILStubClass.IL_STUB_PInvoke(System.Runtime.InteropServices.CriticalHandle, UInt64, UInt32, HTTP_REQUEST*, UInt32, UInt32*, System.Threading.NativeOverlapped*) 
000000002038e3b0 000007fe99c697a4 System.Net.HttpListener.GetContext() 
000000002038e4d0 000007fe99c6924f NServiceBus.Gateway.Channels.Http.HttpChannelReceiver.HttpServer() 
000000002038e530 000007fef6fdf8a5 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
000000002038e690 000007fef6fdf609 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
000000002038e6c0 000007fef6fdf5c7 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
000000002038e710 000007fef6ff2d21 System.Threading.ThreadHelper.ThreadStart() 
000000002038ea28 000007fef81cf713 [GCFrame: 000000002038ea28] 
000000002038ed58 000007fef81cf713 [DebuggerU2MCatchHandlerFrame: 000000002038ed58] 
000000002038ef38 000007fef81cf713 [ContextTransitionFrame: 000000002038ef38] 
000000002038f128 000007fef81cf713 [DebuggerU2MCatchHandlerFrame: 000000002038f128] 

问题: 为什么服务控制台报告该服务被停止,尽管过程还是机器

注意主动:重现此问题,您必须安装您的主机作为使用NServiceBus.Master配置文件的Windows服务并尝试重新启动服务,则可能需要更多尝试来解决此问题。

更新:

当我读到NSB代码,在HttpChannelReceiver.Start(),它开始在新线程监听器。

  1. 此监听线程是前台线程。 (所有其他工作线程都是BG线程)
  2. 没有停止信号去这个前台线程
  3. 没有变量/字段持有此线程的引用 - 中止是不可能的。

当ServiceHost杀死当前进程的内存时,这个监听线程才会被回收,直到ServicHost收集它,这个线程将被阻止退出当前进程。

+0

我创建了NSB问题这一点。 https://github.com/NServiceBus/NServiceBus/issues/1083 –

回答

相关问题