Last Updated: Apr 03, 2013 08:46AM IDT
假如你已经写了太多次同样的config代码(译者注:应该是指NServiceBus的那些初始化代码),假如你想要将你的终结点寄宿(host)到windows服务中,那么NServiceBus.Host.exe能够为你做这些事情,并且作为控制台程序运行。
要使开发者去改变没有代码的技术,管理员需要友好地设置权限和账户,host精简服务开发以及部署。
下面是NServiceBus host能够为你带来的一些特性:
Overview
如果你正在实现一些后端的消息处理,那么你就不需要去写自己的宿主进程了。 只需要引用NServiceBus.Host.exe,以及写一个继承自IConfigureThisEndpoint 的类,明确是否想要server或者client行为(下面会介绍),这就够了。
为了F5以及debug你的终结点,确保你已经改变了这个编译设置,右击选择属性就可以设置:
选择启动行为设置好'NServiceBus.Host.exe' 在你的工程中的 /bin/debug 中的路径,这个设置只针对单个用户,如果想要这个设置作用于所有开发者,可以参考官网。
下面开始介绍NServiceBus.Host.exe如何读取配置:
Configuration
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>
File Scanning
默认地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的正确运行时必要的。
Logging
假如你想要改变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.(译者注:这段翻译待深入之后补充)
Built-in Configurations
尽管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的基础设施,更多细节描述详见the profiles page.
Installation
为了将你的进程安装为一个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