我正在探索用Java创建简单业务规则引擎的不同方法.我需要向客户端提供一个简单的webapp,让他配置一堆规则.规则库的示例可能如下所示:
这是一个例子:
IF (PATIENT_TYPE = "A" AND ADMISSION_TYPE="O")
SEND TO OUTPATIENT
ELSE IF PATIENT_TYPE = "B"
SEND TO INPATIENT
Run Code Online (Sandbox Code Playgroud)
规则引擎非常简单,最终操作可能只是两个操作中的一个,发送给住院病人或门诊病人.表达式中涉及的运算符可以是=,>,<,!=表达式之间的逻辑运算符AND, OR and NOT.
我想构建一个Web应用程序,用户将在一个小脚本中编写textarea,我会评估表达式 - 这样,业务规则用简单的英语解释,业务用户可以完全控制逻辑.
从我迄今为止所做的研究中,我遇到了,ANTLR并编写了自己的脚本语言作为解决此问题的可能选项.我没有探索像Drools规则引擎这样的选项,因为我觉得这可能是一种矫枉过正.你有解决这类问题的经验吗?如果是的话,你是怎么做到的?
我正在使用带有集成测试环境的Rational Application Developer v7.0.当我调试我的webapp时,调试模式下的服务器启动时间接近5-6分钟 - 足够的时间休息一下!
有时,我很生气,因为我开始诅咒IBM构建操作系统而不是应用服务器!产生20多个流程和无用的服务,没有记录的配置来调整它,以更快的速度启动.
我相信有很多java开发人员会同意我的意见.我试图通过我的管理控制台禁用默认应用程序和一组服务,但这没有多大帮助.
我没有web服务,没有企业bean,没有队列,只是一个需要连接池的简单Web应用程序.你有没有做过一些事情来制作你的集成测试环境,在调试模式下快速启动并在那里消耗更少的RAM?
更新:我尝试禁用一些服务(国际化,默认应用程序等......),现在WebSphere服务器变得越来越糟糕.它不仅不需要可怕的启动时间,它会不时地冻结长达2分钟.:-(听起来,优化并不是一件好事,总是!
我正在研究一种解决方案,旨在解决新手程序员在修改代码时遇到的问题,同时修复错误/执行更改请求,以及生产中的代码.我们都知道Eclipse是一个很棒的IDE.代码完成,打开声明,类型层次结构,包浏览器,导航器,查找引用等功能可以帮助人们更快地修复事物,比如使用像Textpad这样的东西.
如果您是一名新手java程序员并且您正在使用Eclipse IDE,那么您认为Eclipse IDE的哪些区域不太有用/不太直观?如果您是一名经验丰富的程序员,那么新手会为您解决的常见问题是什么?
请忽略与以下相关的问题:域专业知识(业务知识),Infra(测试您的更改等),性能相关(eclipse搜索速度慢等),特定语言的技能级别(将开发人员视为菜鸟). ..并且想一种语言 - Java
我在我的小团队做了一个本地调查,这里有一些:
在这一点上,对我来说,作为有兴趣为我的研究收集意见的人,似乎Eclipse可以使用更多的"上下文运行时提示".
我相信社区还有更多要添加的内容......请添加更多您的负面体验(仅从代码更改角度来看).
编辑: 我想,我的问题太漫长而且令人困惑.我会稍微改写它并保持简短:
虽然"做出更改代码"(没有类似于代码格式化,红外线相关活动,CVS等......这样说重构)的Eclipse IDE的,什么功能(S)你不喜欢/最讨厌的?以下是示例:
比如说,您提交的表单会影响您的数据库(添加记录/删除/更新它们),这就是您的请求的样子:
POST/application/action = update
现在,比如说,您完成了更新,因此您希望将用户带到主页.
Response.sendRedirect/application/action = home
这非常好用.在POST之后向用户发送重定向,因此即使用户尝试通过按F5刷新页面,您也很好.但是,如果您这样做,这将无效:
调用RequestDispatcher.forward(/应用/动作=家)
鉴于在完成更新后您必须显示不同类型的错误/成功消息,您很可能在POST后执行转发.在这种情况下,您如何避免更新操作发生两次?
我觉得很有趣的是,许多安全站点(银行)/支付网关倾向于通过在屏幕上放置文本来通知用户,例如"请不要按回/刷新按钮".
有没有更好的方法来处理这个?除了要求用户不要按这些按钮?当我上次检查时,有一个叫做"垂直响应缓存"的东西.一个过滤器,用于在会话中标识您的请求的唯一性,并在请求重复时尝试发送缓存的响应.有没有更简单的方法来解决这个经典问题?
这是我正在讨论的垂直响应缓存解决方案的链接:http://www.fingo.info/en/articles/_1.html.我是,但是,不确定这真的有多好.
所以,这是一段使用CodeModel生成java代码的代码:
JCodeModel cm = new JCodeModel();
JDefinedClass dc = cm._class("foo.Bar");
JMethod m = dc.method(0, int.class, "foo");
m.body()._return(JExpr.lit(5));
File f = new File("C:/target/classes");
f.mkdirs();
cm.build(f);
Run Code Online (Sandbox Code Playgroud)
此代码生成.java文件:
package foo;
public class Bar {
int foo() {
return 5;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不希望CodeModel为我创建一个新的java文件.我已经有一个.java文件,并希望在其中的方法中添加几行代码.所以,我希望API直接修改java文件/创建它的修改后的副本.有办法做到这一点吗?
单独部署Web服务或者它们是Web应用程序的一部分是一种好的做法吗?例如,我正在开发基于Spring rest的Web服务.该服务的功能是,用于获取用户数据.
查询此Web服务的每个Web应用程序都将其用户数据放在不同的模式中.那么,现在web服务需要知道谁在调用它 - 它是Appilcation A还是Application B?如果它是AppA,那么它应该从Schema A获取数据,如果它是AppB,那么它是另一个模式.请注意,AppA和AppB只是包含在两个不同战争中的相同代码,它们应该查询的模式是从属性文件提供的.
在这种情况下,使用webapp代码打包webservice并在不同的上下文中部署它是否有意义,因此它成为在不同上下文中运行的duplciate服务.或者,它是否应该单独部署,并且应该以某种方式将AppA和AppB标识为此Web服务?
好的,所以我有这样的课
public class Calculator {
@Test(dataProvider = "dp")
public void add(int a, int b) {
System.out.println("Invoked add: a, b" + a + "," + b);
}
@DataProvider(name = "dp")
public Object[][] createData(ITestContext ctx) {
return new Object[][] { new Object[] { 1, 2 }, new Object[] { 2, 3 } };
}
Run Code Online (Sandbox Code Playgroud)
当测试运行时,它将运行add方法两次.我想基于其输入跟踪每个添加唯一的调用.所以说,使用1,2作为输入调用add,然后这是一个唯一的调用.如果失败,我想将此信息存储到具有调用ID的数据库中.
我如何使用testng实现这一目标?所有侦听器(methodinvocationlistener等)似乎都没有提供唯一标识方法运行的上下文.是的,他们确实让你看到参数,但我无法跟踪个别参数.那么,我是否以某种方式将自己的唯一参数注入结果对象并从那里跟踪它?
UPDATE
我正在添加改进的代码,以帮助更好地理解上下文.这是我的testng.xml
<suite name="Default Suite">
<test name="test">
<classes>
<class name="com.test.testng.Calculator">
<methods>
<include name="add">
<parameter name="data-id" value="1"/>
</include> <!-- add -->
<include name="add">
<parameter name="data-id" value="2"/>
</include> …Run Code Online (Sandbox Code Playgroud) 我一直在尝试理解MapReduce概念并将其应用于我目前的情况.我的情况怎么样?好吧,我这里有一个ETL工具,其中数据转换发生在源和目标数据源(数据库)之外.因此,源数据源纯粹用于加载的提取和目标.
因此,今天的这种转变行为,对于一百万条记录来说需要大约X小时.我想解决一个我将拥有十亿条记录的情况,但我希望在相同的X小时内完成工作.因此,我的产品需要根据数据规模进行扩展(添加更多商品机器).正如您所看到的,我只担心将产品转换功能分配到不同机器的能力,并利用所有这些机器的CPU功率.
我开始寻找选项,我遇到了Apache Hadoop,最后是MapReduce的概念.我在快速安装Hadoop时非常成功,而不会遇到集群模式的问题,并且很高兴能够运行wordcount演示.很快,我意识到为了实现我自己的MapReduce模型,我必须将我的产品转换功能重新定义为MAP和REDUCE功能.
这是麻烦开始的时候.我阅读了Hadoop:Definitive Guide的副本,我理解Hadoop的许多常见用例都在以下情况中:
这是我的场景,我从数据库中提取并加载到数据库(具有结构化数据),我的唯一目的是以可靠的方式引入更多的CPU,并通过分发我的转换.重新定义我的转换以适应Map和Reduce模型本身就是一个巨大的挑战.所以这是我的问题:
您是否在ETL场景中使用过Hadoop?如果是,可以具体说明您如何处理转换的MapReducing?你是否纯粹使用Hadoop来利用额外的CPU能力?
MapReduce概念是分布式计算的通用答案吗?还有其他同样好的选择吗?
java architecture hadoop design-patterns distributed-computing
所以我有一张地图:
Map<String, Class> format = new HashMap<String, Class>();
Run Code Online (Sandbox Code Playgroud)
我会像这样添加元素:
format.put("Vendor Number", Integer.class);
format.put("Vendor Dispatch", Date.class);
....
Run Code Online (Sandbox Code Playgroud)
我有一个通用的方法如下:
public static <T> T verifyType(String name, Class<T> type) {
if (type == Integer.class) {
return type.cast(new Integer(Integer.parseInt(name)));
}
......
return null;
}
Run Code Online (Sandbox Code Playgroud)
现在这段代码很好用,没有编译器问题:
Integer i = verifyType("100",Integer.class);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试这个:
Integer i = verifyType("100",format.get("Vendor Number"));
OR
Class type = Integer.class
Integer i = verifyType("100",type);
Run Code Online (Sandbox Code Playgroud)
编译器向我显示此警告:类型安全:未经检查的调用verifyType(String,Class)的泛型方法verifyType(String,Class)
这让我感到困惑......请帮忙...
这个问题是我早期帖子的延续:java中的访问者模式实现 - 这看起来如何?
重构我的代码时我有点困惑.我试图将我的访问者模式(在前一篇文章中解释)转换为复合策略模式.我想做这样的事情:
public interface Rule {
public List<ValidatonError> check(Validatable validatable);
}
Run Code Online (Sandbox Code Playgroud)
现在,我将定义一个这样的规则:
public class ValidCountryRule {
public List<ValidationError> check(Validatable validatable) {
// invokeDAO and do something, if violation met
// add to a list of ValidationErrors.
// return the list.
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以有两个不同类型的对象进行验证.这两个可能是完全不同的:说我有一个商店是Validatable,再一个Schedule是Validatable.现在,如果我写一个看起来像这样的复合:
class Validator implements Rule {
private List<Rule> tests = new ArrayList<Rule>();
public void addRule(Rule rule) {
tests.add(rule);
}
public List<ValidationError> check(Visitable visitable) {
List<ValidationError> list = new ArrayList<ValidationError>(); …Run Code Online (Sandbox Code Playgroud) java ×10
java-ee ×3
architecture ×2
eclipse ×1
form-submit ×1
generics ×1
hadoop ×1
ide ×1
oop ×1
performance ×1
rule-engine ×1
rules ×1
spring ×1
survey ×1
testng ×1
web-services ×1
websphere ×1