#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. Спасибо, Уилл. Действительно полезная идея состоит в том, чтобы сделать ее как можно более простой. Действительно нравится идея аннотации, позволяющая обойти проблему жизненного цикла. Еще раз спасибо