小编Jay*_*Jay的帖子

在java中创建一个简单的规则引擎

我正在探索用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规则引擎这样的选项,因为我觉得这可能是一种矫枉过正.你有解决这类问题的经验吗?如果是的话,你是怎么做到的?

java rule-engine business-rules

32
推荐指数
6
解决办法
7万
查看次数

Websphere应用服务器 - 开始任何快速的操作到底是什么?

我正在使用带有集成测试环境的Rational Application Developer v7.0.当我调试我的webapp时,调试模式下的服务器启动时间接近5-6分钟 - 足够的时间休息一下!

有时,我很生气,因为我开始诅咒IBM构建操作系统而不是应用服务器!产生20多个流程和无用的服务,没有记录的配置来调整它,以更快的速度启动.

我相信有很多java开发人员会同意我的意见.我试图通过我的管理控制台禁用默认应用程序和一组服务,但这没有多大帮助.

我没有web服务,没有企业bean,没有队列,只是一个需要连接池的简单Web应用程序.你有没有做过一些事情来制作你的集成测试环境,在调试模式下快速启动并在那里消耗更少的RAM?

更新:我尝试禁用一些服务(国际化,默认应用程序等......),现在WebSphere服务器变得越来越糟糕.它不仅不需要可怕的启动时间,它会不时地冻结长达2分钟.:-(听起来,优化并不是一件好事,总是!

java performance websphere java-ee

22
推荐指数
4
解决办法
2万
查看次数

Eclipse作为IDE - 作为Java初学者,你会发现什么?

我正在研究一种解决方案,旨在解决新手程序员在修改代码时遇到的问题,同时修复错误/执行更改请求,以及生产中的代码.我们都知道Eclipse是一个很棒的IDE.代码完成,打开声明,类型层次结构,包浏览器,导航器,查找引用等功能可以帮助人们更快地修复事物,比如使用像Textpad这样的东西.

如果您是一名新手java程序员并且您正在使用Eclipse IDE,那么您认为Eclipse IDE的哪些区域不太有用/不太直观?如果您是一名经验丰富的程序员,那么新手会为您解决的常见问题是什么?

请忽略与以下相关的问题:域专业知识(业务知识),Infra(测试您的更改等),性能相关(eclipse搜索速度慢等),特定语言的技能级别(将开发人员视为菜鸟). ..并且想一种语言 - Java

我在我的小团队做了一个本地调查,这里有一些:

  • 新手使用Eclipse来处理写入运行时提供实现的接口的代码.执行"公开声明"将始终显示一个界面.这有时令人困惑.
  • Eclipse在开发EJB时并不直观.当然,您知道创建新bean所需要做的就是右键单击并"创建Bean",但是,一旦创建它,​​就不会显示下一步应该是什么的上下文帮助.例如,生成存根.
  • 当使用实体bean进行数据源映射时,更改某些东西会破坏整个流程并且eclpise永远不会抱怨/提示.
  • 开发使用Struts的应用程序时,eclipse并没有告诉您,当您更改struts-config.xml时,特定的Web流会受到影响.

在这一点上,对我来说,作为有兴趣为我的研究收集意见的人,似乎Eclipse可以使用更多的"上下文运行时提示".

我相信社区还有更多要添加的内容......请添加更多您的负面体验(仅从代码更改角度来看).

编辑: 我想,我的问题太漫长而且令人困惑.我会稍微改写它并保持简短:

虽然"做出更改代码"(没有类似于代码格式化,红外线相关活动,CVS等......这样说重构)的Eclipse IDE的,什么功能(S)你不喜欢/最讨厌的?以下是示例:

  • 修改已写入接口的代码时:'对象实例上的Open Declaration/F3会在运行时提供实现时显示接口'.
  • 使用EJB更改应用程序时:无上下文帮助
  • 使用MVC(Spring/Struts)更改应用程序时:没有关于更改影响的警告.

java eclipse ide survey java-ee

16
推荐指数
3
解决办法
1977
查看次数

POST后你总是重定向吗?如果是的话,你如何管理它?

比如说,您提交的表单会影响您的数据库(添加记录/删除/更新它们),这就是您的请求的样子:

POST/application/action = update

现在,比如说,您完成了更新,因此您希望将用户带到主页.

Response.sendRedirect/application/action = home

这非常好用.在POST之后向用户发送重定向,因此即使用户尝试通过按F5刷新页面,您也很好.但是,如果您这样做,这将无效:

调用RequestDispatcher.forward(/应用/动作=家)

鉴于在完成更新后您必须显示不同类型的错误/成功消息,您很可能在POST后执行转发.在这种情况下,您如何避免更新操作发生两次?

我觉得很有趣的是,许多安全站点(银行)/支付网关倾向于通过在屏幕上放置文本来通知用户,例如"请不要按回/刷新按钮".

有没有更好的方法来处理这个?除了要求用户不要按这些按钮?当我上次检查时,有一个叫做"垂直响应缓存"的东西.一个过滤器,用于在会话中标识您的请求的唯一性,并在请求重复时尝试发送缓存的响应.有没有更简单的方法来解决这个经典问题?

这是我正在讨论的垂直响应缓存解决方案的链接:http://www.fingo.info/en/articles/_1.html.我是,但是,不确定这真的有多好.

java form-submit java-ee

15
推荐指数
2
解决办法
1万
查看次数

以编程方式编辑/修改.java文件?(不是.class文件)

所以,这是一段使用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文件/创建它的修改后的副本.有办法做到这一点吗?

java code-generation

13
推荐指数
2
解决办法
8220
查看次数

部署Web服务的好习惯是什么?

单独部署Web服务或者它们是Web应用程序的一部分是一种好的做法吗?例如,我正在开发基于Spring rest的Web服务.该服务的功能是,用于获取用户数据.

查询此Web服务的每个Web应用程序都将其用户数据放在不同的模式中.那么,现在web服务需要知道谁在调用它 - 它是Appilcation A还是Application B?如果它是AppA,那么它应该从Schema A获取数据,如果它是AppB,那么它是另一个模式.请注意,AppA和AppB只是包含在两个不同战争中的相同代码,它们应该查询的模式是从属性文件提供的.

在这种情况下,使用webapp代码打包webservice并在不同的上下文中部署它是否有意义,因此它成为在不同上下文中运行的duplciate服务.或者,它是否应该单独部署,并且应该以某种方式将AppA和AppB标识为此Web服务?

java architecture spring web-services

13
推荐指数
2
解决办法
822
查看次数

唯一标识testng中的每个测试调用

好的,所以我有这样的课

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)

java testng

10
推荐指数
1
解决办法
2931
查看次数

"采用MapReduce模型"=可扩展性的通用答案吗?

我一直在尝试理解MapReduce概念并将其应用于我目前的情况.我的情况怎么样?好吧,我这里有一个ETL工具,其中数据转换发生在源和目标数据源(数据库)之外.因此,源数据源纯粹用于加载的提取和目标.

因此,今天的这种转变行为,对于一百万条记录来说需要大约X小时.我想解决一个我将拥有十亿条记录的情况,但我希望在相同的X小时内完成工作.因此,我的产品需要根据数据规模进行扩展(添加更多商品机器).正如您所看到的,我只担心将产品转换功能分配到不同机器的能力,并利用所有这些机器的CPU功率.

我开始寻找选项,我遇到了Apache Hadoop,最后是MapReduce的概念.我在快速安装Hadoop时非常成功,而不会遇到集群模式的问题,并且很高兴能够运行wordcount演示.很快,我意识到为了实现我自己的MapReduce模型,我必须将我的产品转换功能重新定义为MAP和REDUCE功能.

这是麻烦开始的时候.我阅读了Hadoop:Definitive Guide的副本,我理解Hadoop的许多常见用例都在以下情况中:

  • 未构造的数据和一个想要执行聚合/排序/或类似的东西.
  • 未经编译的文本,需要执行挖掘
  • 等等!

这是我的场景,我从数据库中提取并加载到数据库(具有结构化数据),我的唯一目的是以可靠的方式引入更多的CPU,并通过分发我的转换.重新定义我的转换以适应Map和Reduce模型本身就是一个巨大的挑战.所以这是我的问题:

  1. 您是否在ETL场景中使用过Hadoop?如果是,可以具体说明您如何处理转换的MapReducing?你是否纯粹使用Hadoop来利用额外的CPU能力?

  2. MapReduce概念是分布式计算的通用答案吗?还有其他同样好的选择吗?

  3. 我的理解是MapReduce适用于大型数据集进行排序/分析/分组/计数/聚合/等,我的描述是否正确?

java architecture hadoop design-patterns distributed-computing

9
推荐指数
1
解决办法
334
查看次数

Class <T>的Java泛型

所以我有一张地图:

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 generics

8
推荐指数
1
解决办法
3万
查看次数

复合策略模式 - java - 这段代码有多糟糕?

这个问题是我早期帖子的延续: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,再一个ScheduleValidatable.现在,如果我写一个看起来像这样的复合:

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 oop design-patterns rules strategy-pattern

8
推荐指数
2
解决办法
4403
查看次数