現在、Apache Ignite をアプリケーションに統合して、クラスター内でセッションを共有しています。Ignite ドキュメントを参照してください。この時点で、2 つのローカル Tomcat インスタンス間でセッションを正常に共有できますが、Ignite でサポートされていない (と思われる) ユース ケースが 1 つあります。
このアプリケーションには、'Profile' と呼ばれるセッション オブジェクトがあります。このプロファイルはユーザー固有であり、ユーザーがアプリケーションを閲覧している間に、あらゆる種類の属性がこのオブジェクトに追加されます。
次の方法で「Profile」オブジェクトを更新します (疑似コード)。
profile = request.getSession().getProfile(); //Get Profile object from session
profile.setLastVisitedPage("test");
Apache Ignite がない場合、セッションには「setLastVisitedPage」(「test」) の正しい値が含まれます。しかし、Ignite を使用する場合、Ignite の「WebSession」オブジェクトの動作は少し異なるようです。セッション オブジェクトで「setLastVisitedPage」値を設定すると、WebSession には最初に正しい値 (「test」) が正しく含まれますが、次のページでは、Ignite キャッシュから解決される WebSession オブジェクトには、変更された「setLastVisitedPage」属性が含まれていません。
Ignite コードを調べたところ、これが期待どおりに機能しない理由がわかりました。Ignite の「WebSession」クラスを見ると、次のメソッドが表示されます。
public void setAttribute(String name, Object val) {
attrs.put(name, val);
if (updates != null)
updates.add(new T2<>(name, val));
}
つまり、Ignite は、セッション オブジェクトを更新するたびに session.setAttribute メソッドを呼び出すことを想定しているため、Ignite は内部の「updates」コレクションに変更を追加します。これは、Ignite グリッド内のオブジェクトを更新するために使用されます。アプリケーションの解決策は、アプリケーションのコードを変更して、更新のたびに setAttribute を呼び出すことですが、コードの依存関係も使用します。これは変更できず、セッション オブジェクトの変更後に setAttribute を呼び出さない場合があります。
セッション オブジェクトの変更後に Ignite が setAttribute を呼び出す必要がある理由はありますか? それとも、これは Ignite の欠陥ですか?