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.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的基礎設施,更多細節描述詳見theprofiles 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翻譯之持久化技術(一):Persistence In NServiceBus持久化
- NServiceBus翻譯之持久化技術(三):Using RavenDB In NServiceBus – Connecting持久化
- NserviceBus翻譯之FAQ:MsmqTransportConfig配置項MQQT
- NServiceBus翻譯之持久化技術(二):Using RavenDB In NServiceBus – Installing持久化
- NServiceBus翻譯之持久化技術(四):How To Debug RavenDB Through Fiddler Using NServiceBus...持久化
- NServiceBus之GateWayGateway
- SOA、ESB、NServiceBus、雲端計算 總結
- NServiceBus 更換服務名及佇列名稱佇列
- 關於專案中NServiceBus和MEF注入(WCF服務代理失效)的兩個問題
- 利用MSMQ傳送訊息(物件)到NServiceBus終結點(不採用Send-Only方式)MQ物件
- Guava翻譯之SmallFunctionGuavaFunction
- 翻譯 - ASP.NET Core 基本知識 - Web 主機 (Web Host)ASP.NETWeb
- guava翻譯系列之JoinerGuava
- guava翻譯系列之SplitterGuava
- Guava文件翻譯之 ServiceGuava
- Guava文件翻譯之ListenableFutureGuava
- 翻譯 - ASP.NET Core 基本知識 - 通用主機 (Generic Host)ASP.NET
- 學php之翻譯wordpress(2)PHP
- 英語翻譯之閒聊也是一門藝術
- Yurii談翻譯(十二)怎樣翻譯更地道:譯者一定要多走一步
- 論機器翻譯之淺薄
- 深入理解Hystrix之文件翻譯
- Kafka之Purgatory Redesign Proposal (翻譯)Kafka
- Guava文件翻譯之 Guava簡介Guava
- 怎麼翻譯整篇Excel文件?Excel文件翻譯一招搞定Excel
- 如何找一個翻譯介面
- 翻譯 | 像 JavaScript 一樣思考JavaScript
- 翻譯完了一本書
- 翻譯
- Yurii談翻譯(五)怎樣翻譯更地道:so…that…的翻譯
- Yurii談翻譯(一)怎樣翻譯更地道:“使”字句,駛向何方?
- dumping_oracle_blocks翻譯(一)個人翻譯,學習總結用OracleBloC
- js逆向之——百度翻譯介面JS
- 如何完成中文翻譯日文線上翻譯
- Yurii談翻譯(四)怎樣翻譯更地道:翻譯如鋪路
- Yurii談翻譯(九)怎樣翻譯更地道:冠詞a的翻譯
- Yurii談翻譯(十)怎樣翻譯更地道:最高階的翻譯
- 翻譯的未來:翻譯機器和譯後編譯編譯