您的位置:首页 > 其它

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

2013-08-27 23:23 483 查看
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
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐