У меня есть следующий POJO:В каком объекте данных я должен создать сеанс Drools/Kie?
public class Transaction {
@Id
private long id;
private String organisationId;
private String resposibleName;
private DateTime transactionTime;
private BigDecimal amount;
...
}
, что я хотел бы применить свои правила. Например, правило образца может быть на его сумме:
rule "SampleRule"
when
$transaction : Transaction(amount > 10)
then
$transaction.setStatus(Status.INVALID);
end
, и я также хочу, чтобы применить некоторые более сложные правила, такие как:
WHEN
сумма сумму полей транзакции в том жеorganisationId
в на прошлой неделе (на основеtransactionTime
) является углубляло чемx
,THEN
$transaction.setStatus(Status.INVALID);
WHEN
есть прошлая сделка с такими жеresponsibleName
как Curr лор сделка оценивается, но отличаетсяorganisationId
, чем текущая,THEN
$transaction.setStatus(Status.INVALID);
Когда есть запрос делается на RESTful конечную точку:
- Я создаю новый
KieSession
- Добавление одного
Transaction
объект для сеанса, - Добавление дополнительных объектов транзакций, которые могут быть связаны с текущим с помощью другого POJO (например, скажем
PastTransaction
как точная копия с теми же полями сTransaction
, я добавляю несколько транзакций, сделанных тем жеorganisationId
сPastTransaction
POJO, чтобы я мог аккумулировать количество полей на них, имея возможность применять более элементарные правила для моего объектаTransaction
. - Точно так же, я добавляю все операции, которые производятся по той же
responsibleName
сResponsibleNameTransaction
POJO и написать правило, чтобы проверить, если какой-либо из них не совпадает с одной из моих одногоTransaction
объекта вKieSession
.
мне было интересно, если там может быть проще/более оптимальный способ добиться того, что я делаю, и оптимизации на какой объект я формируя свои KieSession
с для. У меня есть метод написания моих Transaction
POJO и попадания в db в рамках выполнения правила (например, напишите метод getAllTransactionsByTheResponsibleName
, который возвращает список, а затем проверьте, есть ли объект с разными organisationId
). Таким же образом я могу добавить связанные транзакции как список в KieSession
, а затем запросить список в правиле, что может по крайней мере спасти меня от использования того же POJO под разными именами.
Update:
прорабатывались далее на основе замечаний, это будет возможно держать около миллиарда Transaction
с в рабочей памяти (сеанс для всех сделок)? Или, альтернативно, я могу поместить транзакции на ответственную/организацию в KieSession
(сеанс на ответственную/организацию). Затем как я могу применить некоторые правила исключительно к полям последней транзакции, которая оценивается (или даже задает для нее поле), когда в сеансе есть несколько транзакций (например, $transaction.setStatus(Status.INVALID);
, когда № 1 является истинным, $transaction
является тем, который в настоящее время оценивается)?
Если у вас есть Транзакция, вы можете выбрать другие транзакции в соответствии с № 1 и второй набор в соответствии с № 2, вам больше не понадобятся правила: вы можете вычислить желаемый результат из этих двух коллекций. - Как правило, все транзакции загружаются в рабочую память - возможно, даже в реальном времени - и правила находят транзакции и наборы согласно # 1 и # 2 и оценивают все динамически. Конечно, это зависит от того, как далеко назад вам нужно идти, чтобы обнаружить конфликт в соответствии с № 2. # 1 ограничено на неделю, поэтому вы должны знать, чего ожидать. – laune
Вы имеете в виду методы транзакции, которая возвращает транзакции на основе organisationId и responsibeName? Что вы имеете в виду, мне больше не нужны правила? Я использую Drools по многим причинам, один из которых - для нетехнических людей, которые могут редактировать правила через workbench. Кроме того, у меня есть 10 млн транзакций в день, что может сделать невозможным сохранить все транзакции в памяти в любое время. –
Если выборка соответствующих наборов данных (транзакции) из БД зависит от правила (как предлагает ваше «более сложное» правило), вы не сможете позволить своим нетехническим людям писать это только через верстак. - Рассмотрите № 1: пока вы забираете, вы можете добавить и проверить; однажды вы можете остановить. Рассмотрим № 2: имеет ли смысл получать все T с равным ответственным именем, когда у вас есть положительный результат при встрече с первым? - Правила работают хорошо, если данные находятся в WM, и нет необходимости использовать разные имена классов для написания таких правил. – laune