2010-03-17 4 views
5

डरोल्स डीआरएल नियम सेट को लोड करने के तरीके के वेब पर उदाहरणों का एक समूह है। हालांकि, मुझे JSR94 API का उपयोग कर एक्सेल प्रारूप में निर्णय तालिका को लोड करने के निर्देश या उदाहरण नहीं मिल रहे हैं।JSR94 का उपयोग करके ड्रॉल्स के साथ एक्सेल-आधारित निर्णय तालिका कैसे लोड करूं?

क्या कोई यह जानता है कि यह कैसे करें? यदि हां, तो क्या आप एक साधारण कोड उदाहरण प्रदान कर सकते हैं?

यहां कोड का नमूना टुकड़ा है जो मैं नीचे से काम कर रहा हूं। मैंने उस क्षेत्र को चिह्नित किया है जिस पर मुझे संदेह है कि कुछ गुणों को सेटअप करने की आवश्यकता है और बनाने के लिए दूसरे पैरामीटर के रूप में पारित किया गया है RuleExectuionSet() (हालांकि यह समाधान नहीं हो सकता है)।

package com.sample; 

import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import javax.rules.RuleRuntime; 
import javax.rules.RuleServiceProvider; 
import javax.rules.RuleServiceProviderManager; 
import javax.rules.StatelessRuleSession; 
import javax.rules.admin.LocalRuleExecutionSetProvider; 
import javax.rules.admin.RuleAdministrator; 
import javax.rules.admin.RuleExecutionSet; 

import org.drools.jsr94.rules.RuleServiceProviderImpl; 

/** 
* This is a sample class to launch a decision table. 
*/ 
public class DecisionTableTestJsr94 { 

    // URL to the Decision Table file (via the classpath) 
    private static final String DECISION_TABLE_PATH = "/rules/Sample.xls"; 

    // An arbitrary URI to identify the rule set 
    private static final String BIND_URI = "uri://fake/bind/uri"; 

    public DecisionTableTestJsr94() throws Exception{ 
     // Initialize the needed services 
     RuleServiceProviderManager.registerRuleServiceProvider(RuleServiceProviderImpl.RULE_SERVICE_PROVIDER, RuleServiceProviderImpl.class); 
     RuleServiceProvider ruleServiceProvider = RuleServiceProviderManager.getRuleServiceProvider(RuleServiceProviderImpl.RULE_SERVICE_PROVIDER); 
     RuleAdministrator ruleAdmin = ruleServiceProvider.getRuleAdministrator(); 
     LocalRuleExecutionSetProvider ruleExecutionSetProvider = ruleAdmin.getLocalRuleExecutionSetProvider(null); 

     // Read the decision table 
     InputStream rules = this.getClass().getResourceAsStream(DECISION_TABLE_PATH); 
     Map ruleProperties = new HashMap(); 

     // ** (probably something needs to happen hear with a properties Map, but what? ** 

     RuleExecutionSet ruleExecutionSet = ruleExecutionSetProvider.createRuleExecutionSet(rules, null); 

     // Add the rules 
     ruleAdmin.registerRuleExecutionSet(BIND_URI, ruleExecutionSet, null); 

     // Start the rule session 
     StatelessRuleSession ruleSession = null; 
     ruleSession = (StatelessRuleSession) ruleServiceProvider.getRuleRuntime().createRuleSession(BIND_URI, null, RuleRuntime.STATELESS_SESSION_TYPE); 

     // Create a domain object for the test 
     Message message = new Message(); 
     message.setStatus(Message.HELLO); 
     System.out.println("Message is: '" + message.getMessage() + "'"); // should be null 

     // Run the object through the rules 
     List<Message> inputList = new ArrayList<Message>(); 
     inputList.add(message); 
     ruleSession.executeRules(inputList); 

     // See if the rules modified the object 
     System.out.println("Message is: '" + message.getMessage() + "'"); // should have the appropriate message 
    } 

    public static final void main(String[] args) throws Exception { 
     new DecisionTableTestJsr94(); 
    } 
} 

उत्तर

4

मुझे नहीं लगता कि JSR-94 प्रदाता के रूप में अभी तक एक निर्णय तालिका कार्यान्वयन प्रदान करता है - आप निर्णय तालिका एपीआई का उपयोग करने डीआरएल प्रारूप, जिसे फिर से ऊपर के लिए दे सकते हैं करने के लिए XLS कन्वर्ट करने के लिए की आवश्यकता होगी कोड।

तो यदि आप स्प्रेडशीट कॉम्पलर (org.drools.decisiontables पैकेज) का उपयोग करते हैं जो आपके लिए यह कर सकता है - दुर्भाग्य से इसका मतलब है कि आपको एक डोलॉल्स क्लास (शुद्ध जेएसआर -94 नहीं) आयात करना है ताकि उद्देश्य को हराने में मदद मिल सके।

किसी भी मामले में, यह दुर्लभ है कि जेएसआर -94 एपीआई बहुत उपयोगी है - एक कारण यह है कि यह एपीआई स्पेक के रूप में प्रगति नहीं हुई है। आप JSR-94 (मैंने इसे किया है!) का उपयोग करने के बजाय कोड की कम लाइनों में कुछ प्रमुख नियम इंजनों के लिए तर्कसंगत रूप से "स्टब्स" लागू कर सकते हैं।

एक बार जब यह मेरे लिए उपयोगी था, तब मैं एक परीक्षण उपकरण लिख रहा था जो जेआरयूल्स और ड्रोल दोनों के लिए काम करता था (यह उस मामले में उपयोगी था क्योंकि मैं केवल डेटा से निपट रहा था - नियम नहीं - अपने उपरोक्त कोड में - एक अलग नियम इंजन की जेएसआर -94 "प्लगिंग" का कोई उपयोग नहीं है - अगर आप किसी और चीज पर स्विच करना चाहते हैं तो आपके नियमों को फिर भी लिखना होगा)।

शुभकामनाएं!

1

वैसे मुझे जेएसआर के बारे में पता नहीं है लेकिन निश्चित रूप से आप जेबीपीएम में डोलोल निर्णय तालिका का उपयोग कर सकते हैं। मेरे पास एक क्लास फ़ाइल है जो आपके कोड में आपकी निर्णय तालिका एक्सेल शीट को उम्मीदपूर्वक जोड़ने में आपकी मदद कर सकती है।

package com.sample; 

import java.util.*; 

import org.drools.*; 

import org.jbpm.*; 

public class ProcessRuleTest { 

    public static final void main(String[] args) { 
     try { 
      // load up the knowledge base 
      KnowledgeBase kbase = readKnowledgeBase(); 
      StatefulKnowledgeSession ksession = createSession(kbase); 
      KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory 
        .newFileLogger(ksession, "test"); 

      // set the parameters 
      Map<String, Object> params = new HashMap<String, Object>(); 
      HelloProcessModel hpm = new HelloProcessModel(); 
      hpm.setCount(new Integer("3")); 
      hpm.setUserlocation("NewYorkUser"); 
      params.put("hpm", hpm); 
      ksession.startProcess("looptest777",params); 

      ksession.fireAllRules(); 
      logger.close(); 
     } catch (Throwable t) { 
      t.printStackTrace(); 
     } 
    } 

    private static KnowledgeBase readKnowledgeBase() throws Exception { 
     ProcessBuilderFactory 
       .setProcessBuilderFactoryService(new ProcessBuilderFactoryServiceImpl()); 
     ProcessMarshallerFactory 
       .setProcessMarshallerFactoryService(new ProcessMarshallerFactoryServiceImpl()); 
     ProcessRuntimeFactory 
       .setProcessRuntimeFactoryService(new ProcessRuntimeFactoryServiceImpl()); 
     BPMN2ProcessFactory 
       .setBPMN2ProcessProvider(new BPMN2ProcessProviderImpl()); 
     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory 
       .newKnowledgeBuilder(); 
     kbuilder.add(ResourceFactory.newClassPathResource("processRuleslooptest777.bpmn"), 
       ResourceType.BPMN2); 

     DecisionTableConfiguration config = KnowledgeBuilderFactory.newDecisionTableConfiguration(); 
     config.setInputType(DecisionTableInputType.XLS); 
     kbuilder.add(ResourceFactory.newClassPathResource("LoopConditionRules.xls"), ResourceType.DTABLE, config); 


     /* 
     * Add drl file 
     */ 
     //kbuilder.add(ResourceFactory.newClassPathResource("LoopConditionRules.drl"), ResourceType.DRL); 

     return kbuilder.newKnowledgeBase(); 
    } 

    private static StatefulKnowledgeSession createSession(KnowledgeBase kbase) { 
     Properties properties = new Properties(); 
     properties 
       .put("drools.processInstanceManagerFactory", 
         "org.jbpm.process.instance.impl.DefaultProcessInstanceManagerFactory"); 
     properties.put("drools.processSignalManagerFactory", 
       "org.jbpm.process.instance.event.DefaultSignalManagerFactory"); 
     KnowledgeSessionConfiguration config = KnowledgeBaseFactory 
       .newKnowledgeSessionConfiguration(properties); 
     return kbase.newStatefulKnowledgeSession(config, 
       EnvironmentFactory.newEnvironment()); 
    } 
} 

लाइन kbuilder.add (ResourceFactory.newClassPathResource ("LoopConditionRules.xls"), इस कोड में जिस तरह से परियोजना में डीआरएल फ़ाइल जोड़ने के लिए है, इस पर आप कर सकते हैं के लिए संकेत मिल रहे हों आपके जेएसआर प्रोजेक्ट। सभी बेस्ट।

संबंधित मुद्दे

 संबंधित मुद्दे