Бизнес-правила, управляемые базой данных Java — идеи дизайна?

#java #spring #ejb #scalability #rules

#java #spring #ejb #масштабируемость #Правила

Вопрос:

В настоящее время мое корпоративное приложение работает на Weblogic 10.3.4, Java 1.6 и Spring 2.0.8. Это недавнее обновление, следовательно, Spring еще предстоит обновить, и часть базы кода Java все еще в старом стиле 1.4.

На данный момент мы используем движок propriatory rules engine для запуска наших бизнес-правил. Однако это излишество, поскольку мы не используем ни одну из функций механизма вывода и больше не можем оправдать затраты на лицензию. Планируется написать движок правил, управляемый базой данных.

С каждым запросом формы будет связано любое количество правил, которые будут настроены с использованием нескольких базовых таблиц базы данных.

На данный момент мой проект заключается в том, что каждое правило, определенное в базе данных, будет отображаться через Spring в одноэлементный компонент Spring Bean без состояния. При заданном состоянии формы каждое правило вернет объект respose result. Смотрите фрагмент кода ниже:

  //get List of rules for form from database
 List<RuleConfiguration>  rules = RulesService.getRulesForFormRuleset(formType, filingMethod, rsName, document);

    IssueDocument issues = new IssueDocumentImpl();

     for (RuleConfiguration ruleConfig : rules) {


         //create a rule instance from the Spring Bean Factory
         Rule rule = (Rule) beanFactory.getBean(ruleConfig.getRule().getRuleBeanName());
         RulesIssue issue = rule.runRule(document, ruleConfig);

            if (issue != null)  {  //Issue has been populated rule must have fired
                issues.addNewIssue(issue);
            }
     }

    return issues;
  

Звучит ли это как разумное решение? Я стремился внедрить «легкое» решение, избегающее EJB, поскольку существует более 500 правил, которые в конечном итоге придется написать. Меня больше всего беспокоит то, что, поскольку все это синглтоны и на мой «движок правил» будет большой спрос, нужно ли мне рассматривать какой-то пул компонентов? Любые другие отзывы были бы весьма желательны. Разорвите меня в клочья, если хотите — я могу это принять!

Большое спасибо

Комментарии:

1. Зачем заново изобретать колесо вместо использования механизма правил с открытым исходным кодом?

2. просто чтобы вы знали, «проприетарная» обычно означает «пользовательская система, которой мы владеем и которую создали сами»

3. Может быть, они не хотят вводить несколько мегабайт неизвестной, потенциально (вероятной) недокументированной логики черного ящика в свою инфраструктуру, когда, возможно, все, что им нужно, это список имен классов с некоторой фильтрацией метаданных, которые они могут перебирать.

4. @Will Hartung — в вопросе четко указано, что существует более 500 правил, которые в конечном итоге должны быть написаны

5. @matt b — Итак? Сложность системы правил заключается не в количестве правил, а в их выводе и взаимосвязях в любой конкретной точке. Вы можете пройти долгий путь, прикрепляя простые метаданные к небольшим фрагментам логики, которые были найдены с помощью простого запроса к базе данных, а затем грубо выполнены. Рассмотрим аспекты AOP чего-то вроде сеансовых компонентов EJB. Методы AroundInvoke. Вот и все. Настраивается с помощью аннотаций во время компиляции или XML во время выполнения. Это все, что есть. Это простая система правил с простыми метаданными. Ничего особенного. Даже если у вас их 500.

Ответ №1:

Очевидно, что в такого рода вещах есть две основные области работы.

Первый заключается в определении правил для запуска, а второй — в их фактическом выполнении.

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

Далее следует фактическое выполнение. Если все ваши вещи являются одиночными, то вам нужно будет беспокоиться о запуске singleton, безопасности потоков и т.д.

В принципе, просто убедитесь, что каждое из ваших правил имеет жизненный цикл. «запустить», «выполнить», «остановить». Если это настоящий синглтон, которому требуется некоторое состояние от запуска к запуску, то методы start и stop, скорее всего, будут содержать логику. Если для выполнения входных данных требуется всего лишь немного логики, то, вероятно, нет необходимости в start и stop (они могут быть пустыми методами) или вообще в том, чтобы это был синглтон, поэтому просто создайте новый экземпляр, запустите его и выбросьте.

Вы не упоминаете, что такое «правило» с точки зрения логики. Они легко могут быть простыми классами Java, которые следуют этому жизненному циклу. Добавьте аннотацию @SingeletonRule или реализуйте isSingleton, что угодно.

Действительно, на этом уровне в такого рода системе мало ракетостроения. Волшебство в основном заключается в метаданных и фактическом создании списка правил для выполнения.

Простые системы правил просты.

Комментарии:

1. Спасибо, Уилл. Действительно полезная идея состоит в том, чтобы сделать ее как можно более простой. Действительно нравится идея аннотации, позволяющая обойти проблему жизненного цикла. Еще раз спасибо