How To install a NAV Application Server (NAS)?

How To install a NAV Application Server (NAS)?

Author: Alain Krikilion (alias kriki)

http://www.mibuso.com/howtoinfoprint.asp?FileID=15

許多人都想知道如何才能安裝並且運行NAS.實際上, 並不難. 但是如果你去看手冊的話,看起來似乎很過它本身. 這是因爲手冊考慮到了所有的可能性. 本文描述了我是如何安裝NAS的步驟。我也向我的同事解釋瞭如何安裝,他們也記了筆記,但是當用的時候,卻讀不懂。

所以我決定寫本文說明如何安裝NAS的小文章.

1. 在哪兒安裝?

你可以把它安裝在任何服務器上或者PC上。哪個最好?直到幾年前我想還是最好不要安裝在服務器上,因爲NAS可能會用光CPU的所有處理能力,沒給Database Server留下多少. 現在,很多服務器都不會成爲一個問題了,因爲有多個CPU或者核(在此,我用CPU,但是有也指一個CPU裏的核). NAS使用一個Core.

如果你有一個Navision-Server,就不會有問題,因爲它只使用一個核,或者都不需要。只有當NAS與DB-server 使用同一個core的時候纔會有負面影響. 不知道是否有可能控制它,但是我希望Windows能夠儘量把工作分給不同的core.

如果你有一個SQL-Server,你肯定就需要多核(我認爲SQL最少需要四個核)。那樣就算NAS完全佔用了其中一個,還有其它三個用於SQL。 在正常情況下,一個在SQL上的Navision-DB 不會使用很多資源。


簡言之,我認爲在數據庫上安裝NAS消耗資源的壞處要小於NAS可以不用中間網絡來直接與服務器通信所帶來的好處。我注意到,很多時候客戶端直接在服務器上進行的話會更快(記住:NAS是一個客戶端,但是沒有用戶干預)

2. Window login

NAS需要一個Window login來登錄數據庫。這是因爲它是一個服務,而且並不可能在一個服務裏面來定義一個Database Login.這個服務需要一個Window login來起動(就象你要登錄到Windows). 所以你需要在域裏或者服務器上創建一個Login. 通常我會使用域管理員帳戶,因爲這樣就能讀寫網絡裏面的東西。至少用這個你可以保證權限不會有問題。當然,你必須保證用戶不能創建含有能讓他成爲域管理員指令的指令文件,再給NAS來起動。 不過,在大部分情況下,這不是一個問題。

3. SQL-login (如果你有一個SQL數據庫的話)

現在你有了Window Login, 但是這個login在SQL服務器上還沒有權限。所以你需要在SQL服務器上創建Window Login然後讓它成爲sysadmin. 請自己查看關於如何在SQL這麼做的手冊。

4. NAV-login

現在你在Windows與SQL(如果你有一個SQL數據庫的話)上都OK了,但是你仍然進入不了Navision,所以你需要在Navision數據庫上使用一個Navision SUPER用戶來創建帳戶(在Navison客戶端中:Tools => Security => Windows login ,然後給你的Window用戶以SUPER Role)。現在在權限方面你已經萬事具備了.

5. Installing the NAS.

手持安裝CD,運行/Nas/setup.exe 文件,接受所有默認設置。但是記住安裝NAS的子目錄在哪兒。你之後需要用到.

6. NAS-services (run services.msc)

通常,我從來不使用NAS的默認配置 (nas.exe 與 nassql.exe都是).我會disable這些服務(properties of the service => Startup Type=Disabled).  

 

我爲什麼會這麼做呢?

I我注意到有些時候NASSnapIn.msc不工作, 所以我不能容易地控制或者改變NAS的設置。
如果你需要多個NAS,下一個你就需要手工設置了。所以我第一個就手動安裝然後之後只需要copy或者改變一些參數就可以了。
7. 手動安裝NAS


我總是使用命令文件來配置和起動或 和卸載/或停止這些服務。這些幾乎總是如此,所以我總是copy這些文件和改變一些參數

以下這些事情需要做:

把安裝的NAS子目錄(還記得我要你記住NAS安裝在哪兒嗎?) copy到你想要的地方或者給一個你想要的名字.
在NAS子目錄中創建以下指令文件:(注意下面命令行之前不可以有回車,最好是一行,否則指令出錯)
nasstart.cmd (for SQL-DB)
nassql.exe appservername=TheNasName, NETTYPE=TCP, servername=TheSQLServer,
database=TheSQLDatabase, company="The Company", nettype=tcp,
startupparameter=”THEPARAMETER”, objectcache=40000, installasservice

net start TheNasName.nasstop.cmd (for SQL-DB) (你在第二行的開始要加上":"(原文爲";"))
net stop TheNasName

:nassql.exe appservername=TheNasName, uninstallasservicenasstart.cmd (for Navision-DB)
nas.exe appservername=TheNasName, NETTYPE=TCP, servername=TheNAVServer,
company="The Company", nettype=tcp, startupparameter=”THEPARAMETER”,
objectcache=40000, installasservice

net start TheNasNamenasstop.cmd (for Navision-DB) (你在第二行的開始要加上":"(原文爲";"))
net stop TheNasName

:nas.exe appservername=TheNasName, uninstallasservice如果你想測試一個來自DOS-prompt的NAS,就移除"installaservice",保存文件然後運行. NAS會起動,但是它會使用你現在的login去連接數據庫,所以要確保你有相應的權限。之後,你再添加“, installasservice”.
參數:
appservername: 這是你給NAS命名的名字. 這隻在Windows中使用的名字(This is only the name to be used as reference in Windows).這對Navision C/AL沒什麼意義。最好避免在這個名字裏加上空格或者其它奇怪的字符.
servername: Navision-server 或者SQL-server的名字
databasename: (SQL only) database的名字.
startupparameter: NAS的起動參數. 這個值會在Navision C/AL中使用. 之後會有更多的關於這個的信息.這個名字最好只使用字母數字,不要使用空格或者任何其它怪字符. 如果你想要NAS從事多項工作, 你可以加上一組起動參數,由逗號分隔,比如: startupparameter=”JOB1,JOB2”
現在執行nasstart.cmd. 這將起動NAS作爲一個Service. 在起動了Service後,加一個“:”在nas.exe 或者nassql.exe 命令行前. 這是指註釋掉這項命令行的意思. 從現在開始,如果有需要的話,你可以使用nasstart.cmd(當然也有nasstop.cmd .and also nasstop.cmd)來起動在其它指令文件中的服務.

 

NAS成功起動!
8. NAS-服務(運行 services.msc)

   

現在我們要修正一些NAS-服務的屬性值。打開你新創的NAS-服務的屬性

Tab General
Startup Type:Automatic (這個值可以保證當服務器起動的時候這項服務也起動) (當只是安裝NAS時,這兒應該是automatic).

 
Tab Log On (這兒你必須輸入你在SQL-security和Navision-security定義的Windows login)
This account: Put your windows useraccount in it
Password, confirm password: put the password of the account

 
Tab Recovery (萬一NAS崩潰, 它將自動重新啓動)
First failure, Second failure, Subsequent failures: Restart the service.
Restart service after: 0 minutes

 

 當確認的時候,你會得到以下信息:

 

它的意思就是你需要重新起動NAS-service:

 

9. 如果成功那如何控制NAS

起動eventviewer (eventvwr.msc).
點擊Application,然後在Column Source中搜索你的NAS. 你應該找兩條類型信息

 
如果你查看一下這兩個事件的屬性,你應該可以看到類似以下的信息:

 

 

這就意味頭NAS啓動成功而且控制權已經被給與在Codeunit 1中的ID爲99的function:(就是NasHandler)
10. C/AL

現在我們已經有了一個NAS-service運行, 但是 C/AL 還不知道怎麼做。所以我們必須解釋給 C/AL 聽。NAS有一個傳給Navision代碼的參數(“startupparameter=” ). 現在Navision C/AL必須由這個參數做一些事了。Navision起動codeunit 1中的ID爲99的function.這個function有一個輸入參數(text 260). 在這個變量中,會是輸入型參數.

或者你使用在Navision已經存在的標準的functioality,而你只需要爲它做一些設置(請查看合適手冊)

或者你想使用你自己的functionality. 在這種情況下,你需要做一些代碼工作. 在這個地方,你可以添加一些代碼解釋Navision需要做的事情:

  IF CGNASStartedinLoop = FALSE THEN
    CASE Parameter OF
//> START
      'THEPARAMETER': CODEUNIT.RUN(CODEUNIT::”Some CodeUnit”);
//< STOP
      'OSYNCH','JOBQUEUE':
通常一個singleinstance codeunit 被起動然後配置一些東西然後再沉睡或者等待一些事件來開始工作. 一個事件也可以是Timer-event, 在消息隊列中的消息的來到或者named pipe或者是其它事情.

11. 在C/AL中與NAS交互時需要避免事情:

你不應該在Navision中使用對話框,確認框, strmenu. NAS不喜歡這些並且會給出一個錯誤. 你會得到以下類似錯誤:

 

爲了避免這類錯誤,你需要加一些以下類似代碼(一個例子,你可以在codeunit 90:"Purch.-Post"中找到):

    IF GUIALLOWED THEN
      Window.OPEN(
請不要問爲什麼不用codeunit 80:”Sales-Post”來做這個測試.

12. 在 C/AL與NAS交互時需要避免使用的對象

我另外做了一些說明,所以這非常清楚. 有些對象(Forms,Dataports)不能與NAS使用:

DATAPORTS CANNOT BE RUN WITH THE NAS!!!!

 這就是你會得到的錯誤:

 

怎麼辦? 創建一個report或者codeunit,然後使用一個FILE來讀寫。但是你不能指望由dataport來提供進行自動處理.

13. 在C/AL代碼中的消息與錯誤.

這些並且特殊問題. 這些消息做爲類型消息在eventviewer有寫入日誌. 然後C/AL繼續它的工作.

 

這是我的MESSAGE-statement:

MESSAGE('The NAS has been started.');
 這些消息也會做爲類型消息在eventviewer有寫入日誌,當然處理過程碰到錯誤就會停止.如果這是從codeunit 1中的NasHandler功能中的代碼導致的錯誤,那麼NAS就會崩潰. 不過如果你配置了服務的正確屬性, 那麼服務就會自動起動.


如果這是在單例codeunit中寫的代碼,則NAS-Service就不會崩潰.  單例codeunit可以通過Event-Triggers來重新啓動本身. 以後可以做一例子來說明如何來處理.

 

這是我的ERROR-statement:

ERROR('The NAS has an ERROR-statement in it.');
14. 單例codeunit.

這是一個屬性SingleInstance=Yes的codeunit. (想知道它的意思,請查閱在線幫助或者手冊).

以下說明了如何創建一個單例codeunit,可以每N秒觸發. 這可以用於檢查是否有工作可做,然後就去做.
在單例codeunit中,你需要定義一個全局變量:

autNavisionTimer of type automation and subtype: 'Navision Timer 1.0'.Timer這個全局變量需要把屬性設置爲WithEvents=Yes.
這個屬性會創建兩個另外的方法(functions):

autNavisionTimer::Timer(Milliseconds : Integer)
autNavisionTimer::TimerError(ErrorString : Text[1024])
在方法“autNavisionTimer::Timer” 中, 需要把放入你想每N秒來觸發的代碼. 最好創建一個方法然後把代碼放哪兒,這樣只需要從觸發器中調用方法就成. 記住如果你刪除了全局變量, 你就會在那個觸發器中失去所有的代碼!.

如果在代碼中有錯誤,NAS不會崩潰. 全局變量的Timer-function不會重新啓動function, 就象沒有發生什麼錯誤似的.

在codeunit中的OnRun-trigger中, 你需要初始化這個automation:

OnRun()
CREATE(autNavisionTimer);
autNavisionTimer.Interval(10000); // this will trigger every 10 seconds
autNavisionTimer.Enabled(TRUE);
也請記住在OnRun-trigger 中的錯誤會導致NAS-Service崩潰. 在這種情況下, Windows將會重新啓動NAS-Service(至少如果服務的屬性設置正確).

自己注: 不需要安裝business notifications。並且在NASHANDLER裏面只留下case語句。

我的成功配置:

 

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/BlueSeaWindow/archive/2011/01/11/6129708.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章