0
내 애플리케이션 용 drl 파일을 빌드하고 실행하기 위해 drools 6 패키지를 사용하고 있습니다. [규칙 이름 = '규칙 1'] COM/샘플/Rule_rule_11982550347.java (2 : 그것이DRL이 동적으로로드 된 클래스를 확인하지 못합니다.
룰 컴파일 에러들과 같은 에러를 던지고 규칙 동적 클래스를 사용하는 경우, 정전기 classes.but 미세 일하고 : 28) : 유형 만 가져올 수 있습니다. com.chainsys.csapp.dynaclass.vo.SupplierdivVO는 지식 기반에 클래스 로더를로드 했음에도 패키지
으로 해결됩니다. 다음은 내 코드입니다.
package com.echain.handler;
import java.sql.SQLException;
import java.util.List;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.KieServices;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderConfiguration;
import org.kie.internal.builder.KnowledgeBuilderError;
import org.kie.internal.builder.KnowledgeBuilderErrors;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import com.chainsys.dynui.handler.DynamicFormHandler;
import com.chainsys.dynui.vo.PageEntityVO;
import com.chainsys.dynui.vo.PageInfoVO;
import com.chainsys.fwk.exception.BaseFrameworkException;
import com.chainsys.fwk.util.ChainsysReflection;
import com.chainsys.fwk.util.DynamicClassLoader;
import com.echain.vo.Message;
public class Testing {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Testing test = new Testing();
test.fire();
}
@SuppressWarnings("deprecation")
private void fire() throws Exception {
DynamicClassLoader loader = getClassLoader("Supplier");
KnowledgeBase kBase = readKnowledgeBase(loader);
KieSession kSession = kBase.newKieSession();
KieServices kService = KieServices.Factory.get();
kSession.setGlobal("out", System.out);
kSession.insert(createMessage(kService.getKieClasspathContainer(loader)));
kSession.insert(new Message("Pravin", "Hi"));
kSession.fireAllRules();
kSession.dispose();
}
public KnowledgeBase readKnowledgeBase(ClassLoader loader) throws Exception {
KnowledgeBuilderConfiguration kBuilderConfiguration =
KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, loader);
System.out.println(kBuilderConfiguration);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kBuilderConfiguration);
KieBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(null, loader);
kbuilder.add(ResourceFactory.newByteArrayResource(getRule().getBytes()), ResourceType.DRL);
// kbuilder.add(ResourceFactory.newFileResource("./rulefiles/testing.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error : errors)
System.err.println(error);
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
private String getRule() {
StringBuffer ruleContent = new StringBuffer();
ruleContent.append("package com.sample\n\n");
ruleContent.append("import com.chainsys.csapp.dynaclass.vo.SupplierdivVO;\n\n");
ruleContent.append("import com.echain.vo.Message\n\n");
ruleContent.append("global java.io.PrintStream out \n\n");
ruleContent.append("rule \"rule 1\" when \n");
ruleContent.append(" m : Message() \n");// SupplierdivVO(test1==\"welc\")
ruleContent.append("then \n");
ruleContent.append("out.println(\"hello\");");
ruleContent.append("end\n");
return ruleContent.toString();
}
private Object createMessage(KieContainer kContainer) {
Object o = null;
try {
Class<?> cl = kContainer.getClassLoader().loadClass("com.chainsys.csapp.dynaclass.vo.SupplierdivVO");
o = cl.newInstance();
ChainsysReflection.setProperty(o, "test1", "welc");
} catch (Exception e) {
e.printStackTrace();
}
return o;
}
public DynamicClassLoader getClassLoader(String pageName) throws BaseFrameworkException, SQLException,
ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
DynamicFormHandler handler = new DynamicFormHandler();
PageInfoVO infoVO = handler.getPageInfoVO(pageName, 1);
List<PageEntityVO> eVO = infoVO.getPageEntityList();
DynamicClassLoader classLoader = new DynamicClassLoader(eVO);
return classLoader;
}
}
SupplierDivVO 클래스가 공개되기를 바랍니다. 다시 말해 클래스 파일을 같은 패키지에 보관하여 시도해 볼 수도 있습니다 (예 : com.echain.handler – jsjunkie
@jsjunkie). 실제로 나는 runtime.so에서만 사용할 수있는 동적 클래스를 사용하려고하는데, 나는 지식 기반 configuration.above에 대한 사용자 정의 클래스 로더를 사용하여 정적 클래스에 대해 작동합니다. –
내가 명확하게 이해하지 못했지만, getRule() 메소드에서 동적 클래스를 생성하고 SupplierDivVO를 반입한다고 생각합니다. 클래스 로더 문제가 있다고 생각합니다. 가져 오기 대신 Class.forname()을 사용하여 클래스를로드 할 수 있습니까 ?? 어떠한 경우라도 해결책을 찾으면 알려주십시오. – jsjunkie