Last Updated: Apr 03, 2013 08:46AM IDT
假如你已经写了太多次同样的config代码(译者注:应该是指NServiceBus的那些初始化代码),假如你想要将你的终结点寄宿(host)到windows服务中,那么NServiceBus.Host.exe能够为你做这些事情,并且作为控制台程序运行。
要使开发者去改变没有代码的技术,管理员需要友好地设置权限和账户,host精简服务开发以及部署。
下面是NServiceBus host能够为你带来的一些特性:
如果你正在实现一些后端的消息处理,那么你就不需要去写自己的宿主进程了。 只需要引用NServiceBus.Host.exe,以及写一个继承自IConfigureThisEndpoint 的类,明确是否想要server或者client行为(下面会介绍),这就够了。
为了F5以及debug你的终结点,确保你已经改变了这个编译设置,右击选择属性就可以设置:
选择启动行为设置好'NServiceBus.Host.exe' 在你的工程中的 /bin/debug 中的路径,这个设置只针对单个用户,如果想要这个设置作用于所有开发者,可以参考官网。
下面开始介绍NServiceBus.Host.exe如何读取配置:
Host如何知道应该使用哪个配置文件呢?下面来说说这个过程:
NServiceBus.Host.exe首先扫描运行时路径,载入DLLs到内存中,然后在这些程序集中搜索一个实现了接口IConfigureThisEndpoint的类, 然后持有这个类的程序集的名称就会被用于创建assembly.dll.config ,这个文件就是用于配置的。
你可以通过包含一个名为'NServiceBus.Host.exe.config'的文件去告诉host使用哪个类这种方式来跳过这个扫描过程,在这个文件中你可以明确实现了IConfigureThisEndpoint 这个接口的类,就像下面这样:
<?xml
version="1.0"
encoding="utf-8" ?>
<configuration>
<appSettings>
<add
key="EndpointConfigurationType"
value="YourNamespace.YourTypeName,YourAssembly"/>
</appSettings>
</configuration>
默认地NServiceBus会扫描文件以找到实现了它的接口的类,这个过程是独立于host的文件扫描行为的,发生在l 'NServiceBus.Configure.With()'调用的内部。
如果你想要明确NServiceBus使用哪个程序集,你也需要去设置container。通过实现下面Container部分描述的IWantCustomInitialization接口可以做到这点。 在它的初始化方法中你可以利用正确的方法重载:
Configure.With(string probeDirectory)
Configure.With(params Assembly[] assemblies)
Configure.With(IEnumerable<Type> typesToScan)
记住NServiceBus程序集总是在扫描过程中被包含进来,因为它们对于NServiceBus的正确运行时必要的。
假如你想要改变host使用的日志记录基础设施,那就实现IWantCustomLogging 这个接口,并且在它的初始化方法中做一些特定的设置。 为了让NServiceBus使用你的日志记录方式,你需要使用描在loggingdocumentation中的NServiceBus.SetLoggingLibrary.Log4Net
API ,如下所示:
class MyEndpointConfig :IConfigureThisEndpoint, IWantCustomLogging
{
public
void Init()
{
// setup your logging infrastructure then call
NServiceBus.SetLoggingLibrary.Log4Net(null, yourLogger);
}
}
有可能你想要明确不同的日志级别,或者不同的目标,Host提供了一种机制去改变这些排列,而不需要任何代码或者配置文件的修改,可以通过profiles来实现,这里page有描述。
Custom Initialization and Startup
在标准的NServiceBus的初始化过程的开始,你有可能想要初始化你自己的组件。NServiceBus使得你可以这样去做,直到所有初始化完成才开始处理消息。
在上面所描述的扫描的文件之外,Host会寻找实现了INeedInitialization的类,调用它的Init()方法,最好的做法是对于每一个组建都有一个独立的初始化类,想要多少类都可以,但是你不要做任何关于他们的调用顺序的假设。
如果要改变一些核心的设置,比如程序集扫描,容器,序列化格式等,你需要在EndPoint的配置类(the same class which implements IConfigureThisEndpoint)里面实现IWantCustomInitialization ,这样做要求你编写Configure.With()...这样的配置表达式。
确保不要再你的初始化方法中进行任何启动行为。
启动行为应该在初始化完成之后再开始做,对于这样,NServiceBus将会调用实现了接口IWantToRunWhenTheBusStarts的类。
适合在IWantToRunWhenTheBusStarts 实现类中启动的例子是打开Windows Form应用程序的主窗口。在Windows服务的后端,像Web爬虫,数据挖掘,批量处理等都应该在IWantToRunWhenTheBusStarts 的实现类中拉开序幕。
Containers and Dependency Injection
默认Host将会利用Autofac 作为它内置的容器(依赖注入框架)。 假如你想要使用一个不同的容器,你需要在实现了IConfigureThisEndpoint接口的类中实现接口IWantCustomInitialization,然后提供给NServiceBus一个适配器对象,正如这里page所描述。
下面是一个设置Castle Windsor作为容器的例子:
class EndpointConfig : IConfigureThisEndpoint,AsA_Server, IWantCustomInitialization
{
public
void Init()
{
NServiceBus.Configure.With()
.CastleWindsorBuilder()
.XmlSerializer(); // or BinarySerializer()
}
}
If you omit the serialization configuration XML will beused by default. The rest of the code specifying transport, subscriptionstorage, and other technologies isn't here. This is due to the AsA_Serverbuilt-in configuration described below.(译者注:这段翻译待深入之后补充)
尽管NServiceBus允许你选择使用哪种技术,以及怎么样去配置它们,但是Host已经把这些选择打包成为了三个内置的选项:
AsA_Client, AsA_Server, and AsA_Publisher
所有这几个选项都利用了XmlSerializer,the MsmqTransport, 以及 the UnicastBus. 不同的地方在于每个选项是怎么配置它们的:
AsA_Client设置MsmqTransport为非事务性,启动的时候会清除消息队列。 这就意味着每次启动都是完全刷新,不会记住崩溃之前的任何事情。此外,它会使用自己的权限来处理消息,而不是消息发送者的权限。
AsA_Server设置MsmqTransport为事务性的,启动的时候不会清楚队列中的消息,这使得它具备容错性。 此外,它会在消息处理者的权限之下处理消息,这样可以防止权限攻击。
AsA_Publisher继承自AsA_Server,而且还指示用于存储subscription request的基础设施,更多细节描述详见theprofiles
page.
为了将你的进程安装为一个windows服务,你需要在命令行传递/install到host,默认地服务的名字就是你的终结点的名称,默认地终结点的名称是你的终结点配置类的名称空间。传递/install 将会引起host去调用installers.
你可以像下面这样覆盖这个特性,以及明确额外的安装细节::
USAGE:
NServiceBus.Host.exe [/install [/serviceName]
[/displayName]
[/description]
[/endpointConfigurationType]
[/endpointName]
[/installInfrastructure]
[/scannedAssemblies]
[/dependsOn]
[/sideBySide]
[/startManually]
[/username]
[/password]]
[/uninstall [/serviceName]
[/sidebyside]
[/instance:Instance Name ]
通过运行下面的命令行可以获取这个列表:
> NServiceBus.Host.exe /?
Specifying/serviceName: 你的服务咋注册表中的真实的名称,与显示在Windows服务管理器中的名称不同。
Specifying/displayName: 显示在Windows服务管理器中的服务名称。 假如你不设置这个,而是设置了/serviceName,,那么显示名称将不会使用/serviceName ,而是使用上面的默认描述。
Specifying/description: 描述你的服务,显示在Windows 服务管理器中。
‘Instance’标志允许你安装多个同一个服务的多个实例,但是要提供给每个实例不同的实例名称,例如:: /instance:Instance5.
默认地,Windows服务会在系统启动的时候自动启动,假如你想要你的服务这样,你需要增加/startManually到/install命令。
为了明确你希望你的服务运行在哪个账户之下,需要床底用户名和密码到这个账户。
下面是一个使用/install安装命令的例子:
NServiceBus.Host.exe /install /serviceName:"MyPublisher"
/displayName:"MyPublisher Service"
/description:"Servicefor publishing event messages"
/endpointConfigurationType:"YourEndpointConfigType.YourNameSpace,YourAssembly"
/username:"corp\serviceuser"
/password:"p@ssw0rd!" NServiceBus.Production
卸载的话调用NServiceBus.Host.exe /uninstall:
NServiceBus.Host.exe [/uninstall[/serviceName] [/instance]]
下面是一个卸载的例子:
NServiceBus.Host.exe /uninstall/serviceName:YourServiceName /instance:YourInstanceName
调用infrastructure installers,你需要使用/installInfrastructure switch来运行你的host,Learn aboutinstallers
分享到:
相关推荐
NServiceBus.Extensions.EndpointStarted 启用注册一个回调,以便在启动NServiceBus端点时得到通知: var endpointConfiguration = new EndpointConfiguration ( " SampleEndpoint " ); endpointConfiguration . ...
NServiceBus.SqlPersistence 添加对支持,以将其持久化到Sql数据库。 文献资料 运行测试 有针对多个数据库引擎的测试。 这些可以安装在您的机器上或在docker容器中运行。 这些测试需要在环境变量中设置连接字符串...
NServiceBus 是一个.Net平台下开源的消息服务框架,这类产品有时也被称作ESB(Enterprise Service Bus)——企业服务总线。NServiceBus也是dotnet世界里面最流行的开源企业服务总线。 NServiceBus 是一个用于构建企业...
NServiceBus.Gateway.RavenDB ...运行测试需要RavenDB 4.2和一个名为CommaSeparatedRavenClusterUrls的环境变量,其中包含连接URL,如果测试集群,则用逗号分隔。 可以在Docker容器上托管的RavenDB服务器上运行测试。
NServiceBus.Newtonsoft.Json 的官方序列化程序实现通过我们的了解有关NServiceBus.Newtonsoft.Json的更多信息 如果您有兴趣捐款,请按照的说明进行操作
NServiceBus.AzureFunctions.StorageQueues使用Azure存储队列触发器和NServiceBus消息管道处理AzureFunctions中的消息。在本地运行测试解决方案中包含的测试项目依赖于Azure Functions SDK使用的两个环境变量...
NServiceBus.Gateway.Sql Microsoft SQL Server的官方持久性实现,同时支持和程序包。 通过我们的了解更多。 如何在本地测试 运行测试需要Microsoft SQL Server,它可以从Docker容器托管。 连接字符串是从...
安装此选项以启用NServiceBus以便通过SQL Server进行消息传递 安装 在执行其他任何操作之前,请确保已在环境中启动并运行SQL Server。 还要确保可以从设置中的所有计算机上访问它。 将NServiceBus.SqlServer添加到...
由.net开源ESB框架NServiceBus开发的Demo
NServiceBus.Host NServiceBus主机采用一种自觉的方式进行托管。 使用NServiceBus Host的端点可以作为Windows服务或控制台应用程序运行(例如,在开发过程中)。文献资料完整的文档位于以下位置:6.0.0之前的源代码...
Learning NServiceBus, 2nd Edition
最流行的开源企业服务总线NServiceBus for .Net
NServiceBus.AttributeRouting 通过使用消息类型上的属性,可以配置消息和命令路由: [ RouteTo ( " DestinationEndpoint " )]public class SampleMessage{} 注意:属性是在单独的包中定义的,以防止将端点耦合到此...
要构建NServiceBus,只需在Visual Studio中打开NServiceBus.sln 。 您将在/ binaries中找到构建的程序集。 如果看到构建失败,请检查是否没有将NServiceBus的源放在深子目录中,因为MSBuild不支持长路径名(大于248...
NServiceBus 是一个用于构建企业级 .NET系统的开源通讯框架。它在消息发布/订阅支持、工作流集成和高度可扩展性等方面表现优异,因此是很多分布式系统基础平台的理想选择
NServiceBus OracleAQ 该库提供了在 NServiceBus 框架中使用 Oracle Advanced Queuing (Oracle AQ) 作为传输的能力。...使用 NServiceBus OracleAQ 传输的好处之一是能够从数据库 PL/SQL 过程或代码块发送消息。
NServiceBus.Persistence.AzureStorage 和的官方持久性实现。 通过我们的了解有关NServiceBus.Persistence.AzureStorage的更多信息。 如果您有兴趣捐款,请按照的说明进行操作。运行测试之前测试需要连接到Azure ...
NServiceBus.MessageRouting NServiceBus的EIP消息路由模式的实现当前实现的模式包括路由清单。 计划的是真正的传奇实现(带有补偿动作)等等。布线单使用您可以将邮件路由到一个或多个目标。 每个步骤都会处理该...
验证.NServiceBus 添加支持以验证。社区支持预期所有开发人员都将或拥有以使用NServiceBusExtensions。赞助商通过 支持这个项目。 公司头像将在此处显示,并带有网站链接。 该头像还将被添加到下的所有GitHub存储库...