2016-09-07 8 views
1

Я ищу механизм правил для своего веб-приложения, и я нашел Easy Rules. Однако в разделе часто задаваемых вопросов говорится, что ограничение безопасности потоков.Как многопоточность повлияет на механизм Easy Rules?

Является ли веб-контейнер рассмотрен как многопоточная среда? HTTP-запрос, вероятно, обрабатывается рабочим потоком, созданным сервером приложений.

Как безопасна резьба?

How to deal with thread safety? 

If you run Easy Rules in a multi-threaded environment, you should take into account the following considerations: 

Easy Rules engine holds a set of rules, it is not thread safe. 
By design, rules in Easy Rules encapsulate the business object model they operate on, so they are not thread safe neither. 
Do not try to make everything synchronized or locked down! 

Простые правила двигатель очень легкий объект, и вы можете создать экземпляр для каждого потока, это, безусловно, самый простой способ, чтобы избежать проблем безопасности резьбы

Основано на пример, как многопоточность влияет на механизм правил?

public class AgeRule extends BasicRule { 
    private static final int ADULT_AGE = 18; 

    private Person person; 

    public AgeRule(Person person) { 
     super("AgeRule", 
       "Check if person's age is > 18 and 
       marks the person as adult", 1); 
     this.person = person; 
    } 

    @Override 
    public boolean evaluate() { 
     return person.getAge() > ADULT_AGE; 
    } 

    @Override 
    public void execute() { 
     person.setAdult(true); 
     System.out.printf("Person %s has been marked as adult", 
          person.getName()); 
    } 

} 

public class AlcoholRule extends BasicRule { 

    private Person person; 

    public AlcoholRule(Person person) { 
     super("AlcoholRule", 
       "Children are not allowed to buy alcohol", 
       2); 
     this.person = person; 
    } 

    @Condition 
    public boolean evaluate() { 
     return !person.isAdult(); 
    } 

    @Action 
    public void execute(){ 
     System.out.printf("Shop: Sorry %s, 
       you are not allowed to buy alcohol", 
       person.getName()); 
    } 

} 

public class Launcher { 

    public void someMethod() { 
     //create a person instance 
     Person tom = new Person("Tom", 14); 
     System.out.println("Tom: 
       Hi! can I have some Vodka please?"); 

     //create a rules engine 
     RulesEngine rulesEngine = aNewRulesEngine() 
       .named("shop rules engine") 
       .build(); 

     //register rules 
     rulesEngine.registerRule(new AgeRule(tom)); 
     rulesEngine.registerRule(new AlcoholRule(tom)); 

     //fire rules 
     rulesEngine.fireRules(); 
    } 

} 
+0

Я решил использовать Nashorn в качестве моего механизма правил с JavaScript в качестве языка. Очень легко вставлять и использовать. Это часть JDK7 + и javascript, поскольку язык очень хорошо известен. У вас есть какие-то конкретные требования, которые могут препятствовать JS в качестве языка для правил? – AlexC

+0

Спасибо за обмен, я смотрю на Java на основе механизма правил для оценки. – youcanlearnanything

ответ

2

Да, веб-приложение многопоточное. Как вы ожидаете, существует пул потоков, поддерживаемый сервером. Когда serverocket получает входящий запрос на порт, который он прослушивает, он делегирует запрос потоку из пула. Типично запрос выполняется в этом потоке до тех пор, пока ответ не будет завершен.

Если вы пытаетесь создать единые правила двигатель и несколько потоков доступа к нему, то либо

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

  2. вы используете блокировку, чтобы убедиться, правил, избегая повреждения вашего общего объекта, но в процессе создания узким местом. Все ваши запросы должны ждать, пока механизм правил будет доступен, и только один поток за раз может добиться прогресса.

Гораздо лучше дать каждому запросу свою собственную копию механизма правил, поэтому он не поврежден и не требуется блокировка. Идеальная ситуация для потоков - каждая из них может выполнять самостоятельно, не требуя совместного использования ресурсов.

+0

Если есть только один экземпляр механизма правил, разве это не было бы узким местом для сайтов с большими объемами транзакций? – youcanlearnanything

+0

Мне просто интересно, если я должен вызвать механизм правил, после отправки формы для доступа к кредитным рейтингам заявителя в методе, как многопоточность повлияет на механизм правил? – youcanlearnanything

+0

Как я могу предоставить каждому запросу копию механизма правил? – youcanlearnanything

 Смежные вопросы

  • Нет связанных вопросов^_^