第 8 章 集成规则和应用程序
到目前为止,本指南已经讨论了规则的管理。现在,你将学习在应用程序里使用规则。本节涵盖知识代理(Knowledge Agent)部署组件的用法,它可以自动化这个过程的一大部分。
8.1. 知识代理(Knowledge Agent) 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
重要
jboss-brms-engine.zip
里包括的 README_DEPENDENCIES.txt
包含了每个组件的依赖关系的细节。
知识代理(Knowledge Agent)是一个嵌入在 JBoss Rules 5.0 API 里的组件。使用知识代理不许要其他额外的组件。如果你在是以 JBoss 企业级 BRMS 平台,应用程序只需要在其 classpath 里包含
drools-core
依赖关系,也就是 drools
和 mvel
JAR 文件。这里没有其他的规则专有的依赖关系。
这里也有一个名为 drools-ant 的 ant 任务,你可以用 ant 脚本构建规则并生成 .pkg 文件。最常见的情形是当规则在 IDE(JBoss Developer Studio)里编辑而无需使用 BRMS UI。
在软件包里构建了 BRMS 平台里的软件包后,你旧可以在目标应用程序里使用代理了。
下面的例子构造了一个代理,它将根据路径字符串里指定文件构建一个新的知识库。它每隔60秒(缺省设置)将轮询这些文件是否有了更新。如果找到了新文件,它将构造一个新的知识库。如果指定的资源是一个目录,它里面的内容也将被扫描。
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "MyAgent" ); kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) ); KnowledgeBase kbase = kagent.getKnowledgeBase();
KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent( "MyAgent" );
kagent.applyChangeSet( ResourceFactory.newUrlResource( url ) );
KnowledgeBase kbase = kagent.getKnowledgeBase();
知识代理能接受的配置允许其中一些缺省值被修改。其中的一个例子是属性 "drools.agent.scanDirectories",在缺省情况下任何指定的目录都将被扫描以检测是否有新的内容,你可以禁用这个功能。
这里是一个
change-set.xml
示例。
资源扫描在缺省情况下是启用的。这是一个服务且必须被启动,通知服务也是一样。这可以通过 ResourceFactory 来完成。
ResourceFactory.getResourceChangeNotifierService().start(); ResourceFactory.getResourceChangeScannerService().start();
ResourceFactory.getResourceChangeNotifierService().start();
ResourceFactory.getResourceChangeScannerService().start();
下面是 BRMS UI 的部署界面,它提供了 URL 和软件包的下载地址。
图 8.1. 快照部署
你可以看到 Package URI。这是一个你需要包含在
change-set.xml
文件里的 URL,以指定你需要这个软件包。它指定了一个额外的版本,在这里是一个快照。每个快照都有自己的 URL。如果你需要最新的版本,你可用 LATEST
替换 NewSnapshot
。
你也可以从这里下载一个软件包文件(
PKG
)。将这个文件放入一个目录里并使用知识代理的 file
或 dir
功能。这将自动联系 JBoss 企业版 BRMS 平台服务器以获取在其他情形下可能不需要的更新。
8.2. 手动部署 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
只有将部署集成到自己的机制里的高级用户才需要阅读本节。通常来说你应该使用知识代理。
对于不希望使用知识代理自动部署的用户来说,手动部署是相当简单的。JBoss 企业版 BRMS 平台生成的二进制软件包会序列化为 Package 对象。你可以解序列化并将它们添加到任何知识库里。
在 JBoss 企业版 BRMS 平台里,二进制软件包是由最新的软件包(一旦软件包被成功检验并构建)或部署快照提供的。JBoss 企业版 BRMS 平台开放的 URL 提供了使用 HTTP 的二进制软件包。你也可以执行 "HEAD" 命令来获得软件包最后一次被更新的时间。
8.3. WebDAV 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
"back-end" 库也可以通过
WebDav
访问。WebDav 是一个基于 HTTP 的文件系统应用程序编程接口。大多数的操作系统,包括 Windows、Apple MacOS X 和 Linux 都提供访问 WebDAV 共享目录的集成支持。请参考操作系统供应商提供的配置说明文档。对于多数平台而言,也有许多第三方的 WebDAV 客户端工具。
用 WebDAV 访问库的 URL 和 web 接口的
http://localhost:8080/jboss-brms/org.drools.guvnor.Guvnor/webdav/
http://localhost:8080/jboss-brms/org.drools.guvnor.Guvnor/webdav/
象平常一样这也需要验证。WebDAV 提供了一个软件包和快照目录。
Snapshots
是一个只读目录,它基本上是已创建的知识软件包的快照的视图。packages 目录包含作为目录的知识软件包列表,而目录则包含作为文件的单个资产。
8.3.1. WebDav 和特殊字符 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
BRMS 支持规则名称里含有 UTF-8 字符。然而,当规则通过 WebDav 复制,多字节字符将解码为 ISO-8859-1。
红帽不推荐使用在规则名称里使用特殊字符,然而如果使用了特殊字符,Web 连接器必须进行修改以支持 Unicode。
要添加对 Unicode 的支持,请完成下列步骤。
过程 8.1. 添加对 Unicode 的支持
- 停止应用服务器。
- 打开
server.xml
文件。这个文件位于jbossweb.sar
目录里。 - 在 web 连接器里添加
URIEncoding="UTF-8"
。例如,对于 HTTP,这个代码应该是:<Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
<Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 启动应用服务器。
8.4. URL 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
本节里提及的关于知识代理的软件包部署 URL 也有一些其他特征。
要获得这个软件包而不是二进制软件包的 DRL,附加
.drl
到 URL 的结尾,如 /package/testPDSGetPackage/LATEST.drl,附加 /assetName.drl
,它将显示该条目的 DRL,即使它不是一个 DRL 文件,如 /package/testPDSGetPackage/LATEST/SomeFile.drl
。