2014-09-04 3 views
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; 
} 

} 
+0

SupplierDivVO 클래스가 공개되기를 바랍니다. 다시 말해 클래스 파일을 같은 패키지에 보관하여 시도해 볼 수도 있습니다 (예 : com.echain.handler – jsjunkie

+0

@jsjunkie). 실제로 나는 runtime.so에서만 사용할 수있는 동적 클래스를 사용하려고하는데, 나는 지식 기반 configuration.above에 대한 사용자 정의 클래스 로더를 사용하여 정적 클래스에 대해 작동합니다. –

+0

내가 명확하게 이해하지 못했지만, getRule() 메소드에서 동적 클래스를 생성하고 SupplierDivVO를 반입한다고 생각합니다. 클래스 로더 문제가 있다고 생각합니다. 가져 오기 대신 Class.forname()을 사용하여 클래스를로드 할 수 있습니까 ?? 어떠한 경우라도 해결책을 찾으면 알려주십시오. – jsjunkie

답변

0

항상 지식 기반을 작성하기위한 URL 클래스 로더를 전달하십시오. drools이 URL 클래스 로더 클래스를 작업 메모리에로드하기 때문입니다.

public KnowledgeBase newKBase(URLClassLoader loader) { 

    KnowledgeBuilderConfiguration kbuilderConfig = 
     KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, loader); 
    // Create the agent using the builder configuration 
    KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration(); 
    KnowledgeBaseConfiguration kbaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(null, loader); 
    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig); 
    KnowledgeAgent kagent = 
     KnowledgeAgentFactory.newKnowledgeAgent(knowledgeAgentName, kbase, aconf, kbuilderConfig); 
    kbase = kagent.getKnowledgeBase(); 
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(kbuilderConfig); 

    addRules(kbuilder); 
    KnowledgeBuilderErrors errors = kbuilder.getErrors(); 

    if (errors.size() > 0) { 
     for (KnowledgeBuilderError error : errors) 
      System.err.println(error); 
     throw new IllegalArgumentException("Could not parse knowledge."); 
    } 

    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); 

    return kbase; 
} 

위의 메서드는 throw 오류없이 규칙을로드합니다.