NServiceBus翻译之Hosting(一):The NServiceBus Host

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翻译之Hosting(一):The NServiceBus Host_第1张图片

选择启动行为设置好'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

 

你可能感兴趣的:(NServiceBus翻译之Hosting(一):The NServiceBus Host)