[JBoss]提问:使用drools4.0运行中出现ClassCastException问题(ShadowProxy)

使用drools4.0(包括version 4.0.0 or 4.0.1 or 4.0.2.SNAPSHOT都测试了)出现下面的异常。
现象:junit测试规则没有问题,每次都是获得新的RuleBase。当程序放到应用系统中,系统启动时我初始化RuleBase并bind到jndi上(drools文档中提到过),运行开始一段时间规则调用没有异常,运行一段时间后出现ClassCastException异常,出现的位置是session.insert vo对象只是一个简单的javabean对象,规则根据其中数据匹配

DroolsRulesHandle其他代码使用springside的DroolsTemplate类中的代码
DroolsRulesHandle修改定义了static的rulebase,获得rulebae方式是从jndi上获得的rulebase。

DroolsRulesHandle.java:34 is:

public static void assertObject(StatefulSession session, Object element) throws FactException {
  if (element == null)
   return;
  FactHandle fact = session.getFactHandle(element);
  }
  if (fact == null) {
   session.insert(element);//line 34
  } else {
   session.update(fact, element);
  }
}


Object[] objs = new Object[]{vo, so};//vo,so just are javabean
StatefulSession session = DroolsRulesHandle.getStatefulSession(objs);

出现的异常:
Caused by: java.lang.ClassCastException: com.ejb.vo.WorkItemSoVOShadowProxy
at org.drools.base.com.ejb.vo.WorkItemSoVO$getSoWorkItemType.getValue(Unknown Source)
at org.drools.base.ClassFieldExtractor.getValue(ClassFieldExtractor.java:95)
at org.drools.reteoo.CompositeObjectSinkAdapter$HashKey.setValue(CompositeObjectSinkAdapter.java:476)
at org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:292)
at org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:160)
at org.drools.reteoo.Rete.assertObject(Rete.java:176)
at org.drools.reteoo.ReteooRuleBase.assertObject(ReteooRuleBase.java:196)
at org.drools.reteoo.ReteooWorkingMemory.doInsert(ReteooWorkingMemory.java:70)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:854)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:826)
at org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:627)
at com.im.util.jbossrules.DroolsRulesHandle.assertObject(DroolsRulesHandle.java:34)
at com.im.util.jbossrules.DroolsRulesHandle.getStatefulSession(DroolsRulesHandle.java:52)
at com.im.ejb.domain.PhoneNumberHandleDOM.assignTelNumber(PhoneNumberHandleDOM.java:51)
at com.wm.ejb.domain.WMAdapterForSxDOM.assignNbrNew(WMAdapterForSxDOM.java:658)


baidu上没有搜索到相关信息,google上只能搜索到下面jboss的edson(drools核心开发)和别人邮件内容,当中提到了类似的异常。从内容上我没有完全明白这个异常是否和我碰到的完全一样,我从4.0.0试用了4.0.1到4.0.2.SNAPSHOT。问题还是出现。我现在没有办法确定是我试用rulebase不当,还是drools本身存在bug?
http://www.mail-archive.com/[email protected]/msg02131.html

我将修改rulebase的获得方式,不再从jndi上获得。再测试一样,结果写到本帖回复中。

你可能感兴趣的:(java,jboss,JUnit,ejb,Google)