当前位置:首页 » 编程语言 » java规则引擎

java规则引擎

发布时间: 2022-05-12 12:23:39

1. java实际开发中常用的技术有哪些

RMI: java自身提供的用在分布时对象之间的通信机制。(类似于RPC)

RMI-IIOP: RMI的可移植扩展,可以实现JAVA与CORBA的集成。

JDBC: 用于数据库访问的通用接口。

JTA,JTS: 用于提供事务处理的支持。

JMS: java消息服务。可以连接已有的面向消息的中间件,例如:MQSeries,MSMQ。

Java Servlet: 用来扩展Web服务器功能的网络组件。基于请求/响应机制。

JSP: Java与HTML混合编程,类似于ASP。

JavaIDL: Java对COBRA的实现,允许与其他预言集成。且能让分布式对象利用CORBA提供的全面服务。所以J2EE与CORBA完全兼容。

Java Mail: 平台无关,协议无关地发送邮件。

J2EE连接器架构: 自动管理现有系统和中间件之间的诸多细节。

JAXP: Java操作XML。

JAAS: Java的用户认证支持。

EJB: J2EE中最重要的部分,实现组件式开发的基础。可以在多层的分布式环境中部署的服务器端软件组件。

JNI: (Java Native Interface)

声明Native代码,用C/C++实现它。可以实现:

1、 使用标准JAVA不支持的功能,例如访问Win32API。

2、 重用其他语言编写的库或应用程序。例如大量的C库。

3、 需要用低级语言编程时,例如汇编。

Oracle所实现的C底层代码与Java的无缝集成,就是JNI技术的很好例证。Oracle不单使用Java界面,还支持Java编写的存储过程。

JNDI: 用于访问命令和目录系统。

JNDI为底层命名或目录服务提供统一的API。可支持任何服务器名称,标准服务有:LDAP,NDS,CORBA,LDAP活动目录等。

J2EE终,可用JNDI发布下列组件:EJB,数据源(数据库),JMS消息队列。

2. java 规则引擎哪个好

Java规则引擎API(JSR-94)允许客户程序使用统一的方式和不同厂商的规则引擎产品交互,一定程度上给规则引擎厂商提供了标准化规范。但其几乎没有定义什么是规则引擎,当然也没有深入到规则是如何构建和操纵的,规则调用的效用,规则与Java语言的绑.

3. Java规则引擎如何集成

Java 规则引擎是一种嵌入在 Java 程序中的组件,它的任务是把当前提交给引擎的 Java 数据对象 ( 原料 ) 与加载在引擎中的业务规则( app )进行测试和比对,激活那些符合当前数据状态下的业务规则,根据业务规则中声明的执行逻辑,触发应用程序中对应的操作。

引言:
目前, Java 社区推动并发展了一种引人注目的新技术 ——Java 规则引擎( Rule Engine )。利用它就可以在应用系统中分离商业决策者的商业决策逻辑和应用开发者的技术决策,并把这些商业决策放在中心数据库或其他统一的地方,让它们能在运行时可以动态地管理和修改,从而为企业保持灵活性和竞争力提供有效的技术支持。

规则引擎的原理
1 、基于规则的专家系统( RBES )简介
Java 规则引擎起源于基于规则的专家系统,而基于规则的专家系统又是专家系统的其中一个分支。专家系统属于人工智能的范畴,它模仿人类的推理方式,使用试探性的方法进行推理,并使用人类能理解的术语解释和证明它的推理结论。为了更深入地了解 Java 规则引擎,下面简要地介绍基于规则的专家系统。 RBES 包括三部分:Rule Base ( knowledge base )、 Working Memory ( fact base )和 Inference Engine 。它们的结构如下系统所示:

图 1 基于规则的专家系统构成
如图 1 所示,推理引擎包括三部分:模式匹配器( Pattern Matcher )、议程( Agenda )和执行引擎(Execution Engine )。推理引擎通过决定哪些规则满足事实或目标,并授予规则优先级,满足事实或目标的规则被加入议程。模式匹配器决定选择执行哪个规则,何时执行规则;议程管理模式匹配器挑选出来的规则的执行次序;执行引擎负责执行规则和其他动作。

和人类的思维相对应,推理引擎存在两者推理方式:演绎法( Forward-Chaining )和归纳法( Backward-Chaining )。演绎法从一个初始的事实出发,不断地应用规则得出结论(或执行指定的动作)。而归纳法则是根据假设,不断地寻找符合假设的事实。 Rete 算法是目前效率最高的一个 Forward-Chaining 推理算法,许多 Java 规则引擎都是基于 Rete 算法来进行推理计算的。
推理引擎的推理步骤如下:
(1) 将初始数据( fact )输入 Working Memory 。
(2) 使用 PatternMatcher 比较规则库( rule base )中的规则( rule )和数据( fact )。
(3) 如果执行规则存在冲突( conflict ),即同时激活了多个规则,将冲突的规则放入冲突集合。
(4) 解决冲突,将激活的规则按顺序放入 Agenda 。
(5) 使用执行引擎执行 Agenda 中的规则。重复步骤 2 至 5 ,直到执行完毕所有 Agenda 中的规则。
上述即是规则引擎的原始架构, Java 规则引擎就是从这一原始架构演变而来的。

2 、规则引擎相关构件
规则引擎是一种根据规则中包含的指定过滤条件,判断其能否匹配运行时刻的实时条件来执行规则中所规定的动作的引擎。与规则引擎相关的有四个基本概念,为更好地理解规则引擎的工作原理,下面将对这些概念进行逐一介绍。
1) 信息元( InformationUnit )
信息元是规则引擎的基本建筑块,它是一个包含了特定事件的所有信息的对象。这些信息包括:消息、产生事件的应用程序标识、事件产生事件、信息元类型、相关规则集、通用方法、通用属性以及一些系统相关信息等等。
2) 信息服务( InformationServices )
信息服务产生信息元对象。每个信息服务产生它自己类型相对应的信息元对象。即特定信息服务根据信息元所产生每个信息元对象有相同的格式,但可以有不同的属性和规则集。需要注意的是,在一台机器上可以运行许多不同的信息服务,还可以运行同一信息服务的不同实例。但无论如何,每个信息服务只产生它自己类型相对应的信息元。
3) 规则集( Rule Set )
顾名思义,规则集就是许多规则的集合。每条规则包 含一个条件过滤器 和多个动作 。一个条件过滤器可以包含多个过滤条件。条件过滤器是多个布尔表达式的组合,其组合结果仍然是一个布尔类型的。在程序运行时, 动作将会在条件过滤器值为 true 的情况下执行。除了一般的执行动作,还有三类比较特别的动作,它们分别是:放弃动作( Discard Action )、包含动作( Include Action )和使信息元对象内容持久化的动作。前两种动作类型的区别将在 2.3 规则引擎工作机制小节介绍。
4) 队列管理器( QueueManager )
队列管理器用来管理来自不同信息服务的信息元对象的队列。
下面将研究规则引擎的这些相关构件是如何协同工作的。
如图 2 所示,处理过程分为四个阶段进行:信息服务接受事件并将其转化为信息元,然后这些信息元被传给队列管理器,最后规则引擎接收这些信息元并应用它们自身携带的规则加以执行,直到队列管理器中不再有信息元。

图 2 处理过程协作图
3 、规则引擎的工作机制
下面专门研究规则引擎的内部处理过程。如图 3 所示,规则引擎从队列管理器中依次接收信息元,然后依规则的定义顺序检查信息元所带规则集中的规则(规则已经排队就绪等待信息元的到来)。如图所示,规则引擎检查第一个规则并对其条件过滤器求值,如果值为假,所有与此规则相关的动作皆被忽略并继续执行下一条规则。如果第二条规则的过滤器值为真,所有与此规则相关的动作皆依定义顺序执行,执行完毕继续下一条规则。该信息元中的所有规则执行完毕后,信息元将被销毁 ,然后从队列管理器接收下一个信息元。在这个过程中并未考虑两个特殊动作:放弃动作( Discard Action )和包含动作( Include Action )。放弃动作如果被执行,将会跳过其所在信息元中接下来的所有规则,并销毁所在信息元,规则引擎继续接收队列管理器中的下一个信息元 ( 就是短路了 ) 。包含动作其实就是动作中包含其它现存规则集的动作。包含动作如果被执行,规则引擎将暂停并进入被包含的规则集,执行完毕后,规则引擎还会返回原来暂停的地方继续执行。这一过程将递归进行。

图 3 规则引擎工作机制
Java 规则引擎的工作机制与上述规则引擎机制十分类似,只不过对上述概念进行了重新包装组合。 Java 规则引擎对提交给引擎的 Java 数据对象进行检索,根据这些对象的当前属性值和它们之间的关系,从加载到引擎的规则集中发现符合条件的规则,创建这些规则的执行实例。这些实例将在引擎接到执行指令时、依照某种优先序依次执行。一般来讲, Java 规则引擎内部由下面几个部分构成:
工作内存( Working Memory )即工作区,用于存放被引擎引用的数据对象集合;
规则执行队列,用于存放被激活的规则执行实例 ;
静态规则区,用于存放所有被加载的业务规则,这些规则将按照某种数据结构组织,
当工作区中的数据发生改变后,引擎需要迅速根据工作区中的对象现状,调整规则执行队列中的规则执行实例。Java 规则引擎的结构示意图如图 4 所示。

图 4 Java 规则引擎工作机制
当引擎执行时,会根据规则执行队列中的优先顺序逐条执行规则执行实例,由于规则的执行部分可能会改变工作区的数据对象,从而会使队列中的某些规则执行实例因为条件改变而失效,必须从队列中撤销,也可能会激活原来不满足条件的规则,生成新的规则执行实例进入队列。于是就产生了一种 “ 动态 ” 的规则执行链,形成规则的推理机制。这种规则的 “ 链式 ” 反应完全是由工作区中的数据驱动的。
任何一个规则引擎都需要很好地解决规则的推理机制 和规则条件匹配的效率问题 。规则条件匹配的效率决定了引擎的性能,引擎需要迅速测试工作区中的数据对象,从加载的规则集中发现符合条件的规则,生成规则执行实例。1982 年美国卡耐基 • 梅隆大学的 Charles L. Forgy 发明了一种叫 Rete 算法,很好地解决了这方面的问题。目前世界顶尖的商用业务规则引擎产品基本上都使用 Rete 算法。

4. 规则引擎中怎么引入java文件作为决策表的入参和出参

this代表当前对象,只能在本类中使用
例如本类定义为A,引用类B,类B中有方法参数值为类A,那么A中调用类B的那个方法,就可以使用this传递</ol>

5. JAVA开发工程师的职业发展是

1.Java程序员
这是Java开发工程师的第一阶段了,一般是刚入门Java行业者。这一阶段主要是掌握了一定的Java编程技术,有一定的Java语言基础,能够了解、掌握和编写一定的代码。处在这一阶段的人员,其掌握的技能还是比较基础的。
2.Java初级软件工程师
这一阶段,就要掌握一些Java核心技术了。比如HTML/CSS/JS/XML/AJAX、SQL/MySQL/Oracle/SQLServer/JDBC等。
3.Java中级工程师
这一阶段需要掌握Java核心框架,SSM、SSH、Web服务器等等。
4.Java高级工程师
这一阶段主要是Java高级开发技术,工作流、规则引擎、缓存、集成JCA、EJB、通信/JNDI/JMS/JAF、应用服务器(JBossAS/WebLogic/WebSphere)等。
5.Java系统架构师
Java系统架构师这一职位主要涉及到Java系统的设计与架构,如面向服务架构、面向资源架构、面向云架构、Java与UML建模、Java设计模式等。
6.技术总监
到了技术总监的岗位,就不仅仅只是技术,更多的可能是技术管理职能。如产品管理、项目管理、团队建设、团队提升等,这都是一个技术总监的职责所在。

6. 详解什么是Java规则引擎

Java规则引擎API(JSR-94)允许客户程序使用统一的方式和不同厂商的规则引擎产品交互,一定程度上给规则引擎厂商提供了标准化规范。但其几乎没有定义什么是规则引擎,当然也没有深入到规则是如何构建和操纵的,规则调用的效用,规则与Java语言的绑定等方面。并且JSR-94在对J2EE的支持上也不足。规则语言的标准化,JSR-94的进一步的充实深化都有待研究。

7. java 使用规则引擎drools 出现异常

运行时错误。报的类的错误!和运算没有关系。ClassUtils.java:378 ConditionAnalyzer.java:723
ConditionAnalyzer.java:690 等等 先检查你的ClassUtils类 378行 应该是这里 或以下的类搞错了 导致报许多错误。不要怕。报很多错误,有时,其实就是一个错误引起的。

8. java未来发展趋势

虽然只有10岁,却犹如35岁的青壮年一般,Java已经迅速地在众多领域确立了其地位:对等网络、开放源代码、无线开发和嵌入式应用程序等等,这还只是其中一些。要准确地把握这门语言的走向是很困难的,因为它正在同时向各个方向齐头并进。

关于快速开发的一切

毫无疑问:脚本编写语言,例如Jython、Python、Perl和PHP,正在被越来越多地使用。Jython事实上就是Python编程语言的完整实现。它100%使用纯Java编写而成,并允许对Java库的轻松访问。

这种脚本编写的趋势在很大程度上是由快速应用程序开发(RAD)推动的,这是一种始终都能够赢得追随者的开发风格。由于市场营销的执行者逼迫IT的生产公司加速产品的开发,因此IT的管理者被迫寻找最有效的方式来满足最终期限的要求。在这里RAD是主要的源动力。

“你可能很擅长某些脚本语言,并且能够完成常规Java所不能完成的任务,”Mukund Balasubramanian说。他是位于加利福尼亚州雷德伍德城的Infravio的首席技术官,负责着Java和Web服务的集成。“如果你知道如何使用一门优秀的语言,你就可以在开发中省下很多的时间和金钱。”

脚本语言的优势

Balasubramanian说,脚本语言具有下列优势:

快速开发:脚本语言极大地简化了“开发、部署、测试和调试”的周期过程。
容易部署:大多数脚本语言都能够随时部署,而不需要耗时的编译/打包过程。
同已有技术的集成:脚本语言被Java或者COM这样的组件技术所包围,因此能够有效地利用代码。
易学易用:很多脚本语言的技术要求通常要低一些,因此能够更容易地找到大量合适的技术人员。
动态代码:脚本语言的代码能够被实时生成和执行,这是一项高级特性,在某些应用程序里(例如JavaScript里的动态类型)是很有用也是必需的。
脚本语言的劣势

但是,Java脚本语言有下面这些劣势:

脚本语言不够全面。它们会要求一门“真正的”编程语言的存在;例如,你必须找一个数据库驱动程序将其内置进脚本语言里。
脚本语言并不是软件工程和构建代码结构的最佳选择,例如面向对象和基于组件的开发。
脚本语言通常不是“通用”语言,但是能够根据专门的应用来调整,例如PHP和万维网。

“因此,脚本语言能够在很大程度上加速软件的开发,但是必须要根据具体的应用来仔细选择——例如动态Web页面,或者对‘真正的’编程语言进行补充,就像Jython是对Java的补充一样,”Balasubramanian说。

像IBM的Bean脚本编写框架(Bean Scripting Framework)这样的工具使得将Tcl、Python、Perl和其他脚本语言融合进Java应用程序变得相当容易。Sun、Borland、BEA和其他的公司也提供了类似的工具。但是俄勒冈州威尔逊维尔的Mentor Graphics的资深Java开发人员David Kearns指出,支持一门脚本语言就存在耗时和耗钱的风险,不要说支持六门语言了。

在其最近为Java世界所撰写的一篇文章中,Kearns描述了在你Java应用程序里支持脚本语言所固有的风险。

“在我看来,Jython具有最快的脚本解释器,并有一些强大的编程特性,”他说。“我唯一真正关心的是Jython的控制流句法(control-flow syntax),这可能对你来说很重要,也可能不重要。对于Jacl而言,编写用于Jython的脚本的学习曲线可能要比JavaScript或者BeanShell高,(即学习前者要比学习后两者困难),因为有更多的新东西要学习。如果你想要在Python里编写不同寻常的脚本,那么我推荐你去买本书看看。Python是一门很常见的编程语言,所以你在书店里会有很多的选择。

其他Java脚本语言

下面列举出了一些使用最广泛的面向Java的脚本语言,感谢Java老手——About.com的William Wagers提供这些内容:

Beanshell
BeanShell是一个简短的、免费的、可下载的、可嵌入的Java源代码解释器,它具有使用Java编写成的对象脚本语言的特性。除了普通的脚本命令和句法之外,BeanShell还能够执行标准的Java陈述式和表达式。它能够将脚本对象作为简单的方法闭塞(method closure)来支持,就像Perl和JavaScript里的一样。

Jess
Jess是一个完全使用Java语言编写的规则引擎(rule engine)和脚本环境。Jess最初的灵感来自CLIPS专家系统,但是现在它已经发展成为一个完整的、卓越的动态环境。使用Jess,你能够创建Java applet以及应用程序,并让这些程序根据以说明规则(declarative rule)的形式所提供的信息进行“推理”。

JudoScript
JudoScript是一个Java类的脚本,它具有很多特性:HTTP客户端和服务器编程、文件系统和归档、XML和XSLT脚本编写、JDBC脚本编写,以及HTML修饰能力(scraping)。它还有值得炫耀的带有监控程序的调度程序、sendmail、运行可执行(run executable)、Java GUI的创建、FTP、SSH和SCP,以及Windows注册表等等。这个软件可下载,包括源代码,都是免费的。

Rhino
Rhino使用纯Java编写而成,是一个开放源代码的JavaScript的实现。它通常被嵌入到Java应用程序里,用来向终端用户提供脚本编写的能力。

9. java规则引擎---Jess

该尔杰斯开发环境( JessDE )提供的一套插件为流行的开源的IDE Eclipse的;特别是,这些都是Eclipse的插件版本为3.1或更高版本。请注意,只有JessDE作品的充分“的Eclipse SDK的” -规模较小的“平台运行二进制”是不够的。

要安装JessDE ,只需退出Eclipse的,解压缩所有文件Jess71p2/eclipse进入最高级别的Eclipse的安装目录。确认目录命名为“ plugins/gov.sandia.jess_7.1.0 ”存在,在你的Eclipse的安装目录,然后重新启动Eclipse的。 //////

这段翻译的结果,不是你的SDK 不是 full "Eclipse SDK"

Jess 7.0p1——Java平台规则引擎(一) 2008-07-12 22:21
分类:JESS 字号: 大大 中中 小小 1.入门

1.1.需求

Jess是一个用java语言编写的程序库。因此要使用Jess你需要Java虚拟机(JVM)。你可以从 Sun Microsystems上免费得到一个非常适合用于Windows, Linux,Solaris上的JVM。Jess 7是兼容所有版本的Java,从开始的JDK 1.4到现在的最新版本JDK1.5。版本更老的编号为4.x的Jess兼容JDK 1.0, 5.x版本兼容的是JDK1.1,Jess 6工作在JDK1.2及以上版本。

在使用Jess前请先确认JVM是否正确安装并能正常工作。

使用JessDE集成开发环境,你需要Eclipse SDK的3.1版或更新版本,这个可以从http://www.eclipse.org获得。安装JessDE前请确认Eclipse是已经安装并能正常工作。

Jess类库为另一种语言担任译员,这种语言我在本文档中称为Jess语言。Jess语言是一种高度专业化的Lisp形式语言。

我会认为读者你是将使用这两种或其中一种语言的一个程序员。并且所有的读者都至少有起码Java基础。另外你必须有一个Java运行系统和知道如何以一个简单的方法使用这个系统。你应该知道如何用它来:

· 运行一个Java应用程序

· 处理如CLASSPATH变量的配置问题

· 编译Java源文件集(可选)

如果你没有对Java的环境有基本的熟悉,那么我建议你购买了关于java的基础的书籍。对与各种平台的Java软件以及丰富的教程和文档可以免费从http://java.sun.com上获得。

对于那些将要使用jess语言编写程序的读者,我假定你们已经熟悉了一般程序编写的原理。我会说明整个Jess语言,所以熟悉Lisp是不需要(虽然熟悉是有些用的)。此外,在可能范围内,我将努力说明基于规则系统的最重要的概念,因为它们适用于Jess。再次,我将假定读者对这些概念有了一定的熟悉程度和了解更多。如果不熟悉基于规则系统,你也许应当考虑购买一本关于这一主题的书籍。

许多读者都希望提高Jess的能力,无论是通过向Jess语言加入的命令(用JAVA语言写)或以Java应用的方式嵌入Jess库。另外一些人会想用Jess语言的Java集成能力来从Jess语言程序调用Java函数。在本文档专门针对这类读者的一些章节中,我将承担适度Java编程的知识。我不会教Java语言任何方面的知识,有兴趣的读者可到您当地的书店参阅相关书籍。

这个文档包含了一个目录,在很多书上这些主题也都被列举出来。

1.2.准备

1.2.1.安装包的组成

Jess提供一个可用于所有支持平台的单独的.zip压缩包。这个单独的文件压缩包包含在Windows,UNIX,或Macintosh系统上使用Jess的所有你需要(除了JVM你必须自己安装)的资源。当Jess是解压后,你应该有一个命名为jess71a2 /的目录。在这个目录路径有下列文件和子目录:

README
快速开始指导.

LICENSE
关于Jess使用的您的权利信息.

bin
一个包含Windows 批处理文件(jess.bat)和一个UNIX脚本(Jess)的目录,你可以使用它们启动Jess命令提示符.

lib
该目录含有作为一个Java档案文件的Jess本身。注意,这不是一个“点击”存档文件,你不可以通过双击它运行Jess。这是要注意的。在这个目录的jsr94.jar包中又包含了符合JSR - 94 (javax.rules)的API。

docs/
这是一个文档,以“index.html”为首页的Jess手册。.

examples/jess
一个包含使用Jess语言编写的小程序的目录.

examples/xml
一个包含使用JessML, Jess's XML规则语言编写的小程序的目录.

eclipse
JessDE, 是Jess集成开发环境, 提供支持Eclipse 3.0的插件集。看这里的安装说明。

src (Optional)
如果这个目录存在,它包含全部的Jess规则引擎和开发环境的源代码,包括一个构建它的Ant脚本。

1.2.2.命令行界面

Jess有一个交互的命令行界面。分布包括两个你能运行Jess命令提示符的脚本:其中一个用于Windows,另一个用于UNIX。它们两个都在bin/ directory目录下。运行适合你系统的那一个,然后你应该看到以下的界面:

C:\Jess71a2> bin\jess.bat

Jess, the Rule Engine for the Java Platform

Copyright (C) 2006 Sandia Corporation

Jess Version Jess71a2 9/5/2006

Jess>

这就是Jess的命令。尝试计算一个前缀数学表达式"(+ 2 2)"。不要忘记那些括号!

Jess> (+ 2 2)

4

Jess计算了此函数,并打印结果。在这份文档的下一章,我们会发现Jess规则语言本身的语法。

通过Jess命令行执行Jess代码编写的文件,可以使用批处理命令:

Jess> (batch "examples/jess/sticks.clp")

Who moves first (Computer: c Human: h)?

在前面的例子应注意到,在Jess>提示符后键入命令,Jess将在下一行响应命令。我将在整个这本文档中遵循本约定。

直接从操作系统提示符执行这样的Jess程序,你可以把程序的名字作为Jess脚本的一个参数,这样就可以启动:

C:\Jess71a2> bin\jess.bat examples\jess\sticks.clp

Jess, the Rule Engine for the Java Platform

Copyright (C) 2006 Sandia Corporation

Jess Version Jess71a2 8/28/2006

Who moves first (Computer: c Human: h)?

jess.console类是一个简单的jess命令行界面的图形版。你在窗口的底部输入一个命令,结果就会出现在滚动窗口之上。试着从Jess71a2路径下键入下面命令:

C:\Jess71a2> java -classpath lib\jess.jar jess.Console

1.2.3.Java程序设计语言与Jess

要在你的Java程序中把Jess做为库使用,文件jess.jar(在lib目录下)必须是以一个标准的扩展名安装在类路径之下,或者对你的开发工具配置后能够识别它。做好这些工作的细节是随系统和环境而定的,但在设置一个类路径时通常涉及修改环境变量,并且安装一个标准的扩展名,简单来说就是复制jess.jar到你的$(JAVA_HOME)/jre/lib/ext路径下。可查阅Java文档或介绍Java的文本以了解更多的细节。

1.2.4.Jess例子程序

有一些简单的例子程序(在examples/jess和examples/xml目录下),您可以用这些程序测试你的Jess是否已经安装正确。这些程序包括fullmab.clp,zebra.clp和wordgame.clp。fullmab.clp是关于猴子与香蕉问题的经典版本。要从命令行运行它,只需要输入:

C:\Jess71a2> bin\jess examples\jess\fullmab.clp

和要运行的问题,就会在屏幕上输出结果。任何Jess代码的文件都可以以这种方式运行。像使用批处理函数一样在命令行给一个Jess文件名就可以运行了。因此,一般你只需要保证文件是以:

Jess> (reset)

(run)

结束或根本没有规则将运行。zebra.clp和wordgame.clp程序是两个典型的例子,它们是用来展示Jess如何处理复杂情况的程序。这些例子都产生大量的局部模式匹配,因此它们运行非常慢而且使用了大量的内存。另外的例子包括sticks.clp (互动游戏)和frame.clp (一个使用jess的java集成能力建立图形界面的演示)。

XML的例子在单独的子目录下,每个子目录中都包含有运行例子说明的自述文件。

2.Jess开发环境

Jess 7包括一个基于Eclipse的开发环境。这个开发环境有一个编辑器,一个调试器和一个Rete网络视图。在将来发布的版本中将包含更多组件(规则浏览器和其它工具)。

2.1.安装JessDE

Jess开发环境(JessDE)是作为一个插件集支持流行的开源的集成开发环境Eclipse;该插件支持Eclipse 3.1及其更新版本。应该注意的是JessDE仅仅工作在完全的" Eclipse SDK "上——较小的"二进制运行平台"是不能运行的。

安装JessDE,首先要退出Eclipse,然后从Jess71a2/eclipse解压缩所有文件到顶层的Eclipse的安装路径。确认在你的eclipse安装目录有一个名为" plugins/gov.sandia.jess_7.0.0 "的目录存在,然后重新启动Eclipse。

注意!如果你只是从以前的版本的JessDE更新,你必须在Eclipse的命令行使用"-clean "命令开关,强制更新缓存中有关JessDE插件的信息。如果你不这样做,很多的JessDE的选项可能被禁用,安装后你只需要这样做一次。

2.1.1.验证你的安装

在“Help”菜单下选择“about Eclipse SDK”。在" about Eclipse SDK "主窗口有一个有Jess标志的按钮。单击“Plug-in Details”,如果JessDE已安装妥当,你将发现三个或四个Jess相关插件在列表上——在我的Eclipse中,它们出现在底部。

然后使用“New Project”向导建立一个Java工程。在新的工程中创建一个新文件并命名为“hello.clp”。这个文件会在一个Jess的编辑器中打开,这个编辑器有一个带红色“J”字的银色小球的图标。输入一些Jess代码,如下:

(printout t "Hello, World" crlf)

你应该看到合适的语法被高亮显示。如果看到,祝贺你!工作一切正常!阅读更多JessDE其他功能的信息。

2.1.2.更多的细节

JessDE编辑器在你的Jess文件中能够标示出语法错误和警告。你很可能希望这些标记能出现在Eclipse的“Problems”视图中,尽管在默认情况下它们可能没有显示出来。安装完成JessDE后,重新启动Eclipse,在Problems的视图,在标题栏点击“Filters”的图标,然后选择标着" Jess Problem "(如果没有被选中的话)多选项。你的Problems视图应该马上就会显示Jess错误和警告。

要使用Rete网络视图,你需要安装Eclipse图形编辑框架(GEF)。你可以从Eclipse工程项目页面得到GEF,或通过Eclipse的内置式更新管理器安装它。然后打开这一视图,在“Jess Debugger”组之下Eclipse的“Show view”对话框找到它。那么在Jess编辑窗口中当光标停在某一内部规则时,Rete网络视图将会为这项规则显示出编译的网络。

2.2.使用JessDE

2.2.1.Jess语言编辑器

JessDE编辑器可以编辑“.clp”格式的文件。在默认情况下你建立的任何 “.clp”格式的文件都将使用JessDE编辑器打开。没有单独Jess的视图,或是Jess项目类型;我们期望大多数人都将使用JessDE工具来写Jess/Java混合应用组成的Jess程序,因此JessDE工具将用在Java项目的文件中。在Jess语言代码中JessDE使用你的Java项目的类路径以解决Java中类名称问题——例如,调用defclass函数。

编辑器有您期望的一个现代程序编辑器所应具有的全部功能。

可定制的语法变色

你可以使用Eclipse全局参数对话框中的“Jess Editor”表来改变默认的颜色。

提供模板,槽和函数名的帮助内容

在许多不同地方使用JessDE编辑器你可引用Eclipse的" Content Assist "功能;JessDE将使输入Jess代码变得更容易。在输入时可以使用快捷键Alt-' / '弹出选择列表清单。

自动修复代码的“Quick fix”助手

这个功能默认使用Ctrl-1快捷键,快速匹配能立即知道怎样定义未定义的deftemplates,并为现有的deftemplates(如果它们在相同的文件里被定义)增加新的槽。

实时错误检测标记和错误高亮显示

当你输入有错误和警告时将被高亮显示

代码自动格式化

当你输入时代码自动缩进。你可以从"Source"菜单下选择"Format"命令来格式化一个全部的缓冲区

使用大纲视图快速导航

Eclipse大纲视图列出了所有在缓冲区中定义的结构;你可以点击其中任何一个就能够迅速定位到它

圆括号匹配和自动插入

当你输入一个'('或’”’符号,JessDE就会插入匹配的符号。当你的光标移动到下一个圆括号时,JessDE会显示与之相匹配的圆括号。

通过悬停获得Jess函数和结构在线帮助

快速访问Jess手册中每一个函数和结构类型的描述。

支持deftemplates 和 deffunctions的悬停帮助

如果你将你的鼠标移动到一个deftemplate或deffunction的名字上,任何代码处,JessDE都将显示一个关于这个模板或函数信息的"tooltip"。

Jess程序的运行和调试命令

你可以使用正常Eclipse 的" Run... "菜单或由右击导航项或在编辑窗口运行或调试Jess程序。

2.2.2.文件之间的关联

有时候一个*.clp文件依靠其他的*.clp文件中的代码先被阅读执行。例如,rules.clp 也许需要templates.clp中的定义。没有这些定义,rules.clp将会出现语法错误。为了解决这个问题,你可以使用require*函数。"require*"让你清楚的声明这些关联。

如果一个文件rules.clp依靠在Java中执行的Jess命令,你可以仅仅为了这个目标创建一个特殊的文件处理这个问题(你也许称之为ruledepends.clp),这个特殊的文件包括了编辑器中使rule.clp文件能够正确解析的所有声明。如果你添加"(require* ruledepends)"到rules.clp中,仅当这个外部文件存在的话才会解析,因为它有可能正在开发中。当你部署代码时,你不需要部署ruledepends.clp,只要rules.clp能够从Java代码中取得所需声明。

"require"机制代替了JessDE的早期版本中的"Source dependencies"属性表,"Source dependencies"属性表已不再被支持。

2.2.3.Rete网络视图

使用JessDE的"Rete Network View"你可以即时看到一个衍生自任何规则的Rete网的图形展示。当这个视图是打开时(你可以使用Eclipse中的"Windows | View | Other..."对话框打开它),它会显示基于编辑器插字符所在规则的Rete网络,你可以用这个实时看到修改规则所对应的Rete网络变化。图表的布局方式是远胜于你能从Jess视图命令中得到的----因为这样没有重叠和交叉线,而且每一列的高度都可变。

2.2.4.Jess调试器

JessDE调试器可以让你调试一个在.clp文件中定义的Jess程序。它具有您期望的图形调试器所具有的所有功能:你可以暂停和恢复程序,或以步进方式执行。当程序停止时,执行堆栈的内容将会显示出来,这样你就可以检查在每个堆栈结构中定义的变量。选择的堆栈结构也可以导航到被执行的源码处。在编辑器窗口的左手边缘处,你可以通过右键单击某一规则在任何.clp文件中设置(或清除)断点。断点仅能设在函数(内置或用户自定义)中,所以你不能在defrule 或者deftemplate结构中打断程序执行。然而,你能够在一个调用规则 的左边或右手边的函数中暂停。

3.Jess 语言基础

大多数时间你是在使用Jess语言编写Jess规则。如果你从来没有使用过Lisp,第一次使用Jess规则语言也许看起来就有点奇怪了,但它并不需要太长时间来学习。回报也是丰厚的,你将使用非常少的代码表达复杂的逻辑关系。

在这一章,我们将看到Jess语言的基础语法。在后面的章节中,我们再来学习怎样定义像事实与规则这样的高级概念,但现在我们将学习最基础的。

在本语言指导中,我将使用一个非正规的符号来描述语法。在< >中的基本串是必须提供的数据类型,在方括号中([])的内容是可选的,以 + 结束表示可以出现一次或多次,以 * 结束表示可以出现零次或更多。一般来说, Jess的输入格式是自由的。换行不具有特殊的含义,仅被处理为空格,而异常将被标识。

3.1.符号

符号是Jess语言的一个核心概念。符号是非常类似于其他语言中的标识符。Jess符号包括字母,数字和下面的标点符号:$*=+/<>_?#.。一个符号不能以数字开始,可以以一些特殊的标点符号开始(这些字符作为操作员当出现在符号开始时有着特殊的意义)

Jess符号对于大小写敏感。foo,FOO,和Foo是不同的符号。

最佳的符号是由字母,数字,下划线和破折号组成。破折号是传统的分隔符。如下所示为合法的符号:

foo first-value contestant#1 _abc

Jess中有三种特殊的符号。零,和java中的空值有点类似;真和假是Jess中的布尔类型的值。

3.2.数字

Jess分别使用Java函数parseInt(java.lang.String), parseLong(java.lang.String)和parseDouble(java.lang.String)来解析整型,长整型和浮点型数字。参考本文档中关于这些方法精确的语法描述。如下为合法的数字:

3 4. 5.643 5654L 6.0E4 1D

3.3.字符串

Jess中的字符串是用双引呈来标识的(").。反斜线能够区分嵌入的引号。注意Jess的字符串和Java的字符串在一些重要的地方是不一样的。首先,不会认识转义序列。比如说你不能用一个"\n"字符串来换行。另一方面,真正的换行可以通过双引号中的字符串来实现。他们是字符串的一部分。如下为合法的字符串:

"foo" "Hello, World" "\"Nonsense,\" he said firmly." "Hello,

There"

最后一个字符串相当于Java中的字符串"Hello,\nThere".。

3.4.列表

Jess中的另一个基础语法元素是列表。列表是由圆括号和空,符号,数字,字符串和其他列表组成。如下所示为合法的列表:

(+ 3 2) (a b c) ("Hello, World") () (deftemplate foo (slot bar))

Jess中列表的第一个元素(Lisp中称为列表的car)通常被称列表的头。

3.5.注释

Jess支持两种类型的程序注释。Lisp风格的行注释和C风格的块注释。行注释是以分号开头,延伸到文本中本行的最后。这里有一个行注释的例子:

; This is a list

(a b c)

块注释就和他们在C语言中的用法一样:他们以两个特征符"/*"开始,以"*/"结束。块注释不能嵌套。

/*

Here is an example of a list (commented out):

(a b c)

*/

注释可以在Jess程序的任何地方出现,包括模板和规则的结构里。

3.6.函数调用

和Lisp一样,Jess中的所有代码(控制结构,分配,程序调用)都是以函数调用的方式进行的。没有操作器,一切都是函数调用。然而,有些函数的名字使它们看起来像是Java操作器,在这种情况下,它们就和它们的Java 副本工作的非常相似。

Jess中的函数调用可以理解为简单的列表。函数调用采用前缀表示,如果一个列表的头部是一个已经存在的函数的符号,那么它就可以称为是一个函数调用。举例来说,用+函数来算2和3相加的表达式应该写为(+ 2 3)。在计算时,这个表达式的结果是数字5(不是一个仅包含数字5的列表!)。通常来说,在合适的时候表达式都被看作是这样并通过上下文求值。你可以在Jess>提示符后键入表达式。Jess计算表达式并打印出结果:

Jess> (+ 2 3)

5

Jess> (+ (+ 2 3) (* 3 3))

14

注意你可以嵌套调用函数;外部函数是形成内部函数调用计算的因素。

Jess自身带有大量的内置函数,它们可以用来做一切事情,如数学计算,程序控制和字符处理,让你能够使用Java的API函数。当然你也可以在Jess语言或者是Java语言中定义自己的函数。

其中一个最经常用的函数是printout,它是用来发送文本到Jess的标准输出窗口,或者是输出到一个文件中。完善的解释你必须等待,但是现在,你所要了解的都包含在下面这个例子中:

Jess> (printout t "The answer is " 42 "!" crlf)

The answer is 42!

另一个常用的函数是batch,它是用来计算一个包含Jess代码文件的。要运行Jess源文件examples/jess/hello.clp,你可以键入:

ess> (batch "examples/jess/hello.clp")

Hello, world!

Jess自带的其他的所有函数的详细说明都在Jess function guide.。

3.7.变量

Jess中程序变量是以问号开始的标识符。问号也是变量名的一部分。名字可以包括字母,数字,破折号,下划线,分号和星号的任何组合。

一个变量可以看作是一个简单的符号,数字,字符串或者是一个列表。你可以用bind函数来为变量指定一个值。

Jess> (bind ?x "The value")

"The value"

变量在第一次使用前不需要声明(全局变量除外)。

想在Jess提示符后看到变量 的值,你只需要键入变量的名字:

Jess> (bind ?a 123)

123

Jess> ?a

123

3.7.1.全局变量(默认全局)
你在Jess提示符后或者任何Jess语言程序顶层创建的所有变量, 当重置命令运行的时候都将被清除。这样就使它们稍嫌短暂,对于暂时性变量它们很好用,在标准理解的前提下不是永久全局变量。要创建不被reset销毁的全局变量,你可以用全局结构:

(defglobal [?<global-name> = <value>]+)

全局变量的名称必须是以星号开头以星号结束。合法的全局变量如下:

?*a* ?*all-values* ?*counter*

当全局变量建立以后,它会被初始化赋值。当reset命令随后执行的时候,这个变量可能会用相同的值重新设置,当然这取决于reset-globals的属性设置。有一个称为set-reset-globals的函数可以用来设置这个属性。如例所示:

Jess> (defglobal ?*x* = 3)

TRUE

Jess> ?*x*

3

Jess> (bind ?*x* 4)

4

Jess> ?*x*

4

Jess> (reset)

TRUE

Jess> ?*x*

3

Jess> (bind ?*x* 4)

4

Jess> (set-reset-globals nil)

FALSE

Jess> (reset)

TRUE

Jess> ?*x*

4

您可以阅读Jess function guide.中有关set-reset-globals和相关的get-reset-globals函数的信息。

3.8.控制流

Java中控制流(分支和循环,异常处理等)都是由一些特殊的语法和关键字如if,while,for,和try等来引导的。在Jess中,就如我们前面说过的,所有的一切都是函数调用,控制流也不例外。因此,Jess包含有那些名为if,while,for,和try以及foreach等函数。这些函数就和Java体系中相同名称的结构工作起来类似。

3.8.1.简单循环

例如,如下 是Jess中的一个“while”循环示例:

Jess> (bind ?i 3)

3

Jess> (while (> ?i 0)

(printout t ?i crlf)

(-- ?i))

3

2

1

FALSE

While循环的第一个参数是一个布尔表达式。While函数计算它的第一个参数,如果它为真,就计算它所有其他的参数。它一直进行这个过程直到它的线一个参数值为假。一个while循环总是返回FALSE.

Jess中内置有一些其他的循环函数。详情参看Jess function index.中关于for和foreach的有关描述。Jess中有一个break函数,可以有来跳出循环,也可以很早的从一个规则的右手边返回

//原文地址http://javawei.blog.163.com/blog/static/587005262008612102128488/

10. 规则引擎的VisualRules

规则引擎是外部Java程序调用规则包的一组Java类,其包含在engine.jar中。 外部Java程序调用规则包时只需要用到两个类。一个是 com.flagleader.engine.RuleEngine 。另一个是 com.flagleader.engine.RuleEngineFactory 。
RuleEngineFactory是得到规则引擎实例的工厂类。 通常代码为
RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();
得到规则引擎实例后,可以调用规则引擎中的方法,主要是put、excute和get这三个方法。 put用于传入需要传入的值,excute用于运行指定的规则包,get用于得到传出的值。 一般的调用代码为:
ruleEngine.put(传入对象);
ruleEngine.excute(规则包调用名);
传出对象 = ruleEngine.get(传出对象名);
因此外部程序调用规则包非常简单。只需以上几行代码就可以完成应用。

热点内容
pythonsae 发布:2025-05-10 21:59:30 浏览:964
rdp算法 发布:2025-05-10 21:46:40 浏览:917
c语言求素数的方法 发布:2025-05-10 21:46:39 浏览:764
战地5配置最低怎么设置 发布:2025-05-10 21:44:12 浏览:674
microsoftsql2012 发布:2025-05-10 21:43:33 浏览:428
电脑买个游戏服务器 发布:2025-05-10 21:25:15 浏览:241
机柜存储空间 发布:2025-05-10 21:25:07 浏览:267
安卓手机如何修改首屏 发布:2025-05-10 21:17:59 浏览:959
缓存关联替换 发布:2025-05-10 20:56:34 浏览:618
开源项目源码 发布:2025-05-10 20:56:24 浏览:36