Как установить другое событие @expires для подклассов в drools - PullRequest
1 голос
/ 26 марта 2020

Допустим, у меня есть класс, представляющий событие (слюни в потоковом режиме), и я установил истечение срока действия для этого события следующим образом:

@Role(Role.Type.EVENT)
@Expires("1m")
public class EventWithShortExpiration {}

Это прекрасно работает. Через 1 минуту после вставки этого события оно автоматически извлекается из рабочей памяти. Теперь предположим, что у меня есть другой класс (унаследованный от вышеуказанного класса):

@Role(Role.Type.EVENT)
@Expires("10m")
public class EventWithLongExpiration extends EventWithShortExpiration {}

Так что я ожидаю, что события EventWithLongExpiration будут отозваны через 10 мес. В качестве альтернативы я мог бы также использовать решение, в котором у подкласса вообще нет срока действия, или у суперкласса вообще нет срока действия, все комбинации проверены и не работают.

На самом деле происходит следующее: Определение super @expires всегда имеет приоритет над определением подкласса @expires. Если у суперкласса вообще нет срока действия, и только у подкласса он есть, срок действия вообще не существует ни для одного из классов, и объекты никогда не убираются.

Есть ли способ заставить эту работу и иметь 2 различные политики истечения срока действия для подклассов?

Чтобы было ясно, я хочу запрашивать только супертипы в моих запросах DRL и получать экземпляры как суперкласса, так и подкласса в одном выражении, но я хочу, чтобы они получить обратно после различных периодов.

1 Ответ

0 голосов
/ 28 марта 2020

Объявление внутри правила работает как положено.

declare EventWithShortExpiration @role (event) @expires (1m) end
declare EventWithLongExpiration @role (event) @expires (10m) end

test

@DroolsSession("classpath:/test.drl")
public class PlaygroundTest {

    @Rule
    public DroolsAssert drools = new DroolsAssert();

    @Test
    public void testIt() {
        drools.insertAndFire(new EventWithShortExpiration(1), new EventWithLongExpiration(2));
        drools.assertFactsCount(2);

        drools.advanceTime(1, MINUTES);
        drools.assertFactsCount(1);

        drools.advanceTime(9, MINUTES);
        drools.assertFactsCount(0);
    }
}

домен

public class EventWithShortExpiration {
    public int ordinal;

    public EventWithShortExpiration(int ordinal) {
        this.ordinal = ordinal;
    }
}

public class EventWithLongExpiration extends EventWithShortExpiration {

    public EventWithLongExpiration(int ordinal) {
        super(ordinal);
    }
}

rule

declare EventWithShortExpiration @role (event) @expires (1m) end
declare EventWithLongExpiration @role (event) @expires (10m) end

rule 'test rule'
    when
        $event : EventWithShortExpiration() 
    then
        System.out.println($event.ordinal);
end

test output

00:00:00 --> inserted: EventWithShortExpiration[ordinal=1]
00:00:00 --> fireAllRules
00:00:00 <-- 'test rule' has been activated by the tuple [EventWithShortExpiration]
1
00:00:00 --> inserted: EventWithLongExpiration[ordinal=2]
00:00:00 --> fireAllRules
00:00:00 <-- 'test rule' has been activated by the tuple [EventWithLongExpiration]
2

PS: не получилось заставить аннотации работать так, как ожидалось, скорее всего из-за способа чтения и применения аннотаций. Я бы отнесся к этому как к слюне. Протестировано на 7.28.0. Финал.

...