2016-09-07 8 views
1

Webアプリケーション用のルールエンジンを探していて、簡単なルールが見つかりました。しかし、FAQセクションでは、スレッドの安全性に関する制限が記載されています。マルチスレッドが簡単ルールエンジンにどのように影響しますか?

Webコンテナはマルチスレッド環境と考えられていますか? 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! 

簡単ルールエンジンは非常に軽量オブジェクトであり、あなたがスレッドごとにインスタンスを作成することができ、これははるかにスレッド安全性の問題

thたとえば、マルチスレッドがルールエンジンにどのように影響しますか?

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

私はJavaScriptを言語としてルールエンジンとしてNashornを使用することに決めました。埋め込みと使用が非常に簡単です。言語が非常によく知られているので、JDK7 +とjavascriptの一部です。ルールの言語としてJSを除外する特定の要件はありますか? – AlexC

+0

共有してくれてありがとう、私は評価のためのルールエンジンに基づいてJavaを見ている。 – youcanlearnanything

答えて

2

はい、Webアプリケーションはマルチスレッドです。期待どおり、サーバーによって管理されるスレッドのプールがあります。 serversocketは、listenするポートで着信要求を受け取ると、その要求をプールからのスレッドに委譲します。通常、応答は完了するまでそのスレッドで要求が実行されます。

あなたは、単一のルール・エンジンを作成し、複数のスレッドが、その後、いずれかの

  1. ルールエンジンデータは、複数のスレッドによって操作された結果として破損している(データ構造が意図していないので、それにアクセスできるようにしようスレッドセーフであるかどうかは、複数のステップで操作できます。これらの操作は、他のスレッドが同じデータにアクセスしているときに他のスレッドが干渉する可能性があります)、または

  2. ロックを使用して、ルールエンジンを使用して、共有オブジェクトが破損しないようにしますが、プロセスcreatボトルネックを起こす。すべてのリクエストは、ルールエンジンが使用可能になるのを待つ必要があり、一度に1つのスレッドのみが処理を進めることができます。

各リクエストに独自のルールエンジンのコピーを付けるほうが、破損することはなく、ロックする必要はありません。スレッドの理想的な状況は、共有リソースを争う必要なしに、それぞれが独立して実行できることです。

+0

ルールエンジンのインスタンスが1つしかない場合、トランザクション量の多いWebサイトのボトルネックにはなりませんか? – youcanlearnanything

+0

ルールエンジンを呼び出すと、メソッドの申請者の信用格付けにアクセスするフォームを提出すると、マルチスレッドがルールエンジンにどのような影響を与えるのでしょうか? – youcanlearnanything

+0

どのように各リクエストにルールエンジンのコピーを渡すのですか? – youcanlearnanything

関連する問題