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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值