2017-01-14 10 views
1

これは実際にはDrools自体とは関係ないかもしれませんが、おそらくJavaのネイティブソリューションを持っている可能性があります。私はちょうど完全なJavaのnoobであり、プロジェクトを継承しているので、ベストプラクティスを理解しようとしています。JBoss Drools KieBaseコレクションを外部ストレージ用にシリアル化するにはどうすればよいですか?

私たちには、クライアントがビジネスルールを動的に設定できるルールベースのマルチテナントシステムがあります。私たちは、stringがそれぞれ独自のクライアントを表すUUIDあるこの

ConcurrentMap<String, KieBase> rules = new ConcurrentHashMap<>();

のように見えますConcurrentHashMapに各クライアントのコンパイル済みのルールを格納します。しかし、この問題は、計算を水平方向にスケーリングすることが問題になります。これは、メモリハッシュマップ内で各変更ごとに再コンパイルされるためです。私たちがそれをスケールアウトした場合、すべてのクライアントは新しいルールの変更を聞いて、それが起こるたびにいつでも再コンパイルする必要があります。

私の最終目標は、複数のインスタンスがコンパイルされたルールを共有することができるようにJVMの外でこれらの計算のルールを格納することで、他のすべてのインスタンスことかもしれないが、それらのインスタンスのいずれかが安全に、同時に特定のクライアントのためのルールを再コンパイルすることができクライアントは、だから私の考えは鍵がclient_idのだろうと値はDroolsのKieBaseオブジェクトの直列化されたバージョンになりAK/Vロック/ストアとしてのRedisを使用していた

を待つだろうとのルールを必要とします。再計算ではtransaction(またはそれに類するロックアルゴリズム)を使用してそのキーにredisストアをロックするので、そのclient_idのKieBaseを必要とする他のインスタンスはコンパイルが完了してdbに書き戻されるまで待機します。

だから私はいくつかの質問を持っている:

  1. は、この連載は、Droolsの特定のものをオブジェクトKieBaseまたは任意のオブジェクトのためのJavaでの一般的なマーシャリングの直列化メカニズムがあるです(?これは推奨されます)
  2. reddissonのようなものは、私が探しているものとまったく同じですか?もしそうなら、誰かが正しい方向に私を向けるスニペットを持っていますか?私は基本的に各クライアントの鍵をロックする必要があります。そのため、複数のインスタンスがブロックされている間にブロックされますが、ハッシュマップの1つのエントリだけをロックすることは望ましくありません。

答えて

0

単純なObjectOutputStreamは、KieBaseオブジェクトのシリアル化には十分です。以下はファイルへの書き込みに使用されますが、ByteArrayOutputStreamに書き込んで結果をどちらかの形式で取得することで、Stringまたはbyte []を作成できます。ロックするよう

KieBase kieBase = kieContainer.getKieBase(); 
FileOutputStream fos = new FileOutputStream(OUTPATH); 
ObjectOutputStream oos = new ObjectOutputStream(fos); 
oos.writeObject(kieBase); 
oos.close(); 

FileInputStream fis = new FileInputStream(OUTPATH); 
ObjectInputStream ois = new ObjectInputStream(fis); 
KieBase kieBase1 = (KieBase)ois.readObject(); 
ois.close(); 

は、それはあなたが(ネットワーク内)平行に走る複数のアプリケーションに対する外部表現をロックする必要があるかどうかに依存し、またはHashMapの中にすべてのものを維持し、単一の(サーバー)アプリケーションがあるかどうか。後者の場合には、任意のJavaオブジェクトは、モニターがあります。

synchronized(idString) { 
    idString.wait(); // or overloaded form with timeout 
} 

// different thread 
synchronized(idString){ 
    idString.notify(); 
} 

あなたはブライアン・ゲッツ」本 『実践でのJava並行処理』を参照すると良いかもしれません。

適切なDBには書き込みロック機構があります。また、あなたの場合には、MS WindowsおよびすべてのUnicesで利用可能な簡単なファイルストレージとファイルロックで管理することさえ可能かもしれません。

+0

ありがとうございました。上記の最終目標を明確にしました。これは複数の実行中のJavaプロセス間でこのハッシュマップを共有する "依存"シナリオで_former_を実行することです。私はByteArrayのものを調べますが、それは私に良いスタートを与えます。私は、Jedisを使ってそのByteArrayをRedisに直接格納できるようです。ロックについては、私はRedisトランザクションで逃げることができないのか、Redissonのようなより高度なアルゴリズムが必要なのかどうかはわかりません。 – brad

+0

適切なDBには書き込みロック機構があります。また、あなたの場合には、MS WindowsおよびすべてのUnicesで利用可能な簡単なファイルストレージとファイルロックで管理することさえ可能かもしれません。 – laune

+0

私はDBへのパブリックインターフェイスが必要なので、私は水平方向に拡大縮小できます。私は最終的に私がレディソンがおそらく私が望むことをするだろうと分かったと思います。分散された並行性の問題を扱い、オブジェクトを再帰的にシリアル化することができます – brad

関連する問題