использовать java.util.Date в LHS правила - PullRequest
1 голос
/ 14 марта 2012

Я новичок слюней, изучаю слюни и работаю около 10 дней. Я столкнулся с проблемой, что объект Date () должен сравниваться в части LHS правила.

    // in Java
    SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss");
    session.setGlobal("currentDate", format.format(new Date()));       

    # in drl file
    global java.lang.String currentDate ;
    #global java.util.Date currentDate; both tested
    when
    $united : LotteryUnitedDO(lotteryTypeId == LotteryTypeEnum.SSQ, 
        totalFee >= 1000, 
        shareCnt >= (0.1 * totalShare),
        #unitedEndTime is a java.util.Date Object
            unitedEndTime > currentDate     
        )

значением currentDate является текущая дата, я видел несколько примеров и статей, делающих это, но они использовали только часть даты «гггг-мм-дд». И все же я должен сравнить часть "чч: мм: сс". как это:

    $dateInputBox : DateInputBox(verifyDate > "12-Oct-2005")        

Я попытался изменить свойство «drools.dateformat» и отформатировать дату, вставленную в базу знаний, только для того, чтобы получить различную ошибку компиляции. дата в ЛХС?

Заранее спасибо, все ваши предложения приветствуются.

1 Ответ

9 голосов
/ 14 марта 2012

Для сравнения дат вы можете просто использовать временные операторы Drools Fusion (после, до и т. Д.):

when
  MyClass( myDate after $someOtherDate )
then
  ...

Однако есть еще одна проблема с вашим подходом: вы не должны рассуждать против глобальногов состоянии.См. Руководство эксперта раздел по глобальным переменным.

Понятие "сейчас" в Drools немного проблематично.На самом деле, может быть, «проблематично» - не то слово;давайте идти с "хитрым".То, как вы это представляете, сильно зависит от вашего варианта использования.Я попытаюсь обобщить:

  • Если вы выполняете в сеансе без сохранения состояния, тогда ваш подход будет работать в сочетании с операторами Fusion.Однако, это все еще не рекомендуемая практика.Лучший подход - определить факт, назовите его Now, который содержит одно поле Date.Инициализируйте и вставьте его вместе с другими фактами, а затем рассуждайте вместо глобального.
  • Если у вас сеанс с состоянием, он становится более сложным, потому что реальное время проходит, даже когда сеанс бездействует, то есть ваш Now факт становится все более и более устаревшим.Мы решили это с помощью WorkingMemoryEventListener.Мы используем методы objectInserted, objectRetracted и objectUpdated этого слушателя, чтобы поддерживать актуальность нашего факта Now (нам не нужна точность менее одной минуты, поэтому мы проверяем, прошла ли минута с момента последнего обновления)чтобы избежать ненужных накладных расходов).Правила не будут оцениваться, если рабочая память не изменяется, поэтому использование этого прослушивателя достаточно, чтобы обеспечить обновление Now, когда это необходимо (если только у вас нет запросов, которые зависят от текущего значения Now, но этодругая тема).
  • Вы также можете изучить использование Drools Fusion в режиме STREAM, который имеет понятие «сейчас», но также накладывает некоторые другие требования.См. Fusion docs для получения дополнительной информации.
...