2016-12-08 7 views
2

나는 weekdays.i 규칙 만이 연기, 온도, motion.can 같은 규칙을 가지고 싶어 하나의 요구 사항이 내 요구 사항에 따라 규칙을 만들 수있는 방법을 제안 할 수 있습니다. 일부 예제를 제공하십시오.Drool 규칙은 cron 표현식을 사용합니까?

cron 이외의 시간을 기반으로 규칙을 실행하는 더 좋은 방법이 있습니까?

+0

Drools 설명서를 귀하의 질문에 대한 답으로 복사하여 붙여 넣지 않을 것입니다. 섹션 7.8.2., 타이머 및 캘린더 자신을 찾을 수 있습니다. – laune

답변

1

평일이나 주말에도 규칙을 위반할 수 있습니다. 내가 직면 한 것과 동일한 요구 사항이 있습니다. 해결책을 찾았습니다. 방금 경작 단계 :

DRL 파일 :

package com.javacodegeeks.drools; 


import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.List; 
import java.util.Locale; 


global String topicLevel 
rule "Drools Introduction" 
when 
$droolsIntro : DroolsIntroduction(topic == "Drools") 
then 
System.out.println($droolsIntro.introduceYourself() + ", topic level is " + getDefaultIfNull(topicLevel)); 
end 

rule "Drools Introduction2" 
when 
$droolsIntro : DroolsIntroduction(isTimeBetweenTwoTime("10:12:12","13:13:13","11:12:12") && isExcludeDay("000000","2016-08-08 21:5:21")) 
then 
System.out.println("time valid and sunday"); 
end 

function String getDefaultIfNull(String topicLevel) { 
return topicLevel == null ? "Moderate" : topicLevel; 
} 

function Boolean isTimeBetweenTwoTime(String initialTime, String finalTime, String currentTime) { 
     Boolean valid = false; 
     System.out.println("time check started"); 
     try { 
      if (currentTime == null) { 
       currentTime = new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()); 
       System.out.println("check current time "+currentTime); 
      } 
      System.out.println(initialTime+" -- "+finalTime+" -- -- "+currentTime); 
      String reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"; 
      if (initialTime.matches(reg) && finalTime.matches(reg) && currentTime.matches(reg)) { 
       valid = false; 
       // Start Time 
       java.util.Date inTime = new SimpleDateFormat("HH:mm:ss").parse(initialTime); 
       Calendar initialTimecalendar1 = Calendar.getInstance(); 
       initialTimecalendar1.setTime(inTime); 
       // Current Time 
       java.util.Date checkTime = new SimpleDateFormat("HH:mm:ss").parse(currentTime); 
       Calendar currentTimecalendar3 = Calendar.getInstance(); 
       currentTimecalendar3.setTime(checkTime); 
       // End Time 
       java.util.Date finTime = new SimpleDateFormat("HH:mm:ss").parse(finalTime); 
       Calendar finalTimecalendar2 = Calendar.getInstance(); 
       finalTimecalendar2.setTime(finTime); 
       if (finalTime.compareTo(initialTime) < 0) { 
        finalTimecalendar2.add(Calendar.DATE, 1); 
        currentTimecalendar3.add(Calendar.DATE, 1); 
       } 
       java.util.Date actualTime = currentTimecalendar3.getTime(); 
       if ((actualTime.after(initialTimecalendar1.getTime()) 
         || actualTime.compareTo(initialTimecalendar1.getTime()) == 0) 
         && actualTime.before(finalTimecalendar2.getTime())) { 
        System.out.println("condition matched --- "); 
        valid = true; 
       } 
       System.out.println("returning "+valid); 
       return valid; 
      } else { 
       System.out.println("else false "+valid); 
       return valid; 
       // throw new IllegalArgumentException("not a valid time, 
       // expecting HH:MM:SS format"); 
      } 
     } catch (Exception e) { 
      System.out.println("exception "+valid); 
      valid=false; 
     } 
     System.out.println("finale "+valid); 
     return valid; 
    } 
    function Boolean isExcludeDay(String validdays,String timeStamp) { 
     try { 
      System.out.println("validdays"+validdays); 
      System.out.println("timeStamp"+timeStamp); 
     DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH); 
     Date date = format.parse(timeStamp); 
     Calendar currentTimecalendar3 = Calendar.getInstance(); 
     currentTimecalendar3.setTime(date); 
     int dayOfWeek = currentTimecalendar3.get(Calendar.DAY_OF_WEEK)-1; 
     Character a_char = validdays.charAt(dayOfWeek); 
     System.out.println(a_char); 
     if(a_char.compareTo('1')==0){ 
      return false; 
     }else{ 
      return true; 
     } 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      //e.printStackTrace(); 
      return false; 
     } 
     //return true; 
     //return true; 
    } 
발사 규칙에 대한

자바 코드 :

KieServices ks = KieServices.Factory.get(); 
      KieContainer kContainer = ks.getKieClasspathContainer(); 
      KieSession kSession = kContainer.newKieSession("ksession-rules"); 

      DroolsIntroduction droolsIntroduction = new DroolsIntroduction("Drools");    
      kSession.insert(droolsIntroduction); 
      kSession.insert(new DroolsIntroduction("All")); 
      kSession.insert(new DroolsIntroduction("Specific")); 
      kSession.fireAllRules(); 
      /* try { 
       String string1 = "11:06:13"; 
       Date time1 = new SimpleDateFormat("HH:mm:ss").parse(string1); 
       Calendar calendar1 = Calendar.getInstance(); 
       calendar1.setTime(time1); 

       String string2 = "10:49:00"; 
       Date time2 = new SimpleDateFormat("HH:mm:ss").parse(string2); 
       Calendar calendar2 = Calendar.getInstance(); 
       calendar2.setTime(time2); 
       calendar2.add(Calendar.DATE, 1); 

       String someRandomTime = "01:00:00"; 
       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(Calendar.getInstance().getTime()); 
       String currenttime = new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()); 
       Date d = new SimpleDateFormat("HH:mm:ss").parse(currenttime); 
       Calendar calendar3 = Calendar.getInstance(); 
       calendar3.setTime(d); 
       calendar3.add(Calendar.DATE, 1); 

       Date x = calendar3.getTime(); 
       if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) { 
        //checkes whether the current time is between 14:49:00 and 20:11:13. 
        System.out.println("checkes whether the current time is between 14:49:00 and 20:11:13"); 
        System.out.println(true); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      String ccurrenttime = new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()); 
      System.out.println(ccurrenttime); 
      isBetweenValidTime("09:33:00","09:38:00",ccurrenttime);*/ 


      kSession.setGlobal("topicLevel", "Beginner"); 
      kSession.insert(new DroolsIntroduction("All")); 
      kSession.fireAllRules(); 

참고 : 내가 000000을 언급하고 isExlude 방법에서 모든 일을 발사합니다 해당 규칙을 의미한다 (000000 0은 켜져 있고 1은 꺼짐을 나타냄)

+0

감사합니다 Mahabaleshwar,하지만 당신은 cron 표현을 사용하여 모든 샘플 있습니다. –

+0

이것은 내가 사용하고있는 솔루션입니다. ur 요구 사항도 같을 수 있습니다. 만약 당신이 cron 표현을 원한다면 : – Mahabaleshwar

+0

그냥이 URL을 참조하십시오 http : //www.mastertheboss.com/jboss-jbpm/drools/how-to-create-time-based-rules – Mahabaleshwar