JCachePayaraのソースコードを見ていて、こういうクラスがいるのにふと気づきました。4.1.2.172のリリースで、改善された内容です。NotesPayaraHazelcastSerializerがなにをしてくれるかというと、HazelcastのSerializerをラップすることでシリアライズ/デシリアライズの処理の際に、ClassLoaderをアプリケーション側のものに一時的に差し替えてくれるものみたいです。Payara+Hazelcastで分散処理ができなかったという話Payaraは、サーバーリソースの一部としてHazelcastを管理しますが、セッションレプリケーションやJCacheによるキャッシュを分散管理するのにはいいのですが、Hazelcastの機能のひとつである分散処理を実行しようとすると次のような問題を持っていました。Nodeでタスクが実行された際に、Hazelcastがアプリケーション内にあるタスクを見つけることができない結果として、ClassNotFoundExceptionがスローされ実行に失敗する分散処理を実行した場合にはアプリケーション側のクラスがシリアライズして使われるので、別のNodeにタスクを転送(例えばJCacheのEntryProcessorや、RunnableやCallable)した際に、こうなってしまう、と。EventBusも抱えていたのですが、これは過去のPayaraでは初期化処理時にアプリケーション側のClassLoaderをキャプチャして一時的に差し替えることで回避していました。EventBusについては改善されましたが、それ以外も少し状況が変わったみたいです。Serverのみです。Microについては、同様のことをすると依然としてClassNotFoundExceptionになります。Serviceが分散実行できるか確認してみましょう。この2つを簡単に実装して確認してみます。準備pom.xmlは、こんな感じに。</build>サンプルアプリケーションの実装JAX-RSの有効化まずは、JAX-RSの有効化から。{}EntryProcessor(JCache)続いて、JCacheのEntryProcessorを作ってみます。EntryProcessorのキックは、JAX-RSのリソースクラス内で行うように実装しました。}}JCacheのCacheManagerを@Injectし、初期化処理としてデータの登録。}クラスタ環境下だと、同じことをNode数分だけやる可能性がありますが、そこは今回は置いておきます。EntryProcessorは、別Nodeで実行される場合はシリアライズされて転送されることになるので、Serializableインターフェースを実装しておきます。}実行されたNodeがわかるように、標準出力にメッセージ出力するくらいは仕込んでおきました。あとは、EntryProcessorを実行するだけですね。どのエントリーに対して行うかは、JAX-RSの@PathParamで決めることにしました。Service(Hazelcast)続いては、Hazelcastの分散処理のひとつである、ExecutorServiceを使います。World!!」を返すCallableなタスクを全Nodeで実行します。}}Callableについても、Serializableである必要があります。}HazelcastInstanceは、JNDIルックアップして取得します。ExecutorServiceを取得して全NodeでCallableを実行。処理結果をJAX-RSのリソースメソッドの結果として戻します。Nodeの名前が含まれます。}パッケージングパッケージングは、ふつうにMavenで。package「app.war」というファイルができます。Serverを用意します。今回は、簡単にDockerイメージを使うことにしました。Serverを立ち上げます。「-v」オプションで、ホスト側のディレクトリをDockerイメージ内にマウントしておきましょう。Serverでは、Hazelcastではデフォルトでは無効化されているので、有効化するとともに作成したアプリケーションをデプロイします。Microの内容をそのまま使いました。glassfish/domains/domain1/config/domain.xmlhttps://github.com/payara/Payara/blob/payara-server-4.1.2.172/appserver/extras/payara-micro/payara-micro-boot/src/main/resources/MICRO-INF/domain/domain.xml#L155うまくいけば、Hazelcastクラスタが構成されます。4d77f7ac-b636-4f4b-8dc2-b9db5bcac008}|#]確認それでは、確認してみましょう。JCacheのEntryProcessorから。key=key80}OKそうです。1以外でも以下のようなログが出力されれば、分散実行に成功しています。※データのオーナーのNodeで実行されます。World!!}3つのNodeから結果が返っていることが確認できます。Serviceで、処理がNodeをまたがって実行できていることが確認できましたね。Microでもできてもいい気がするのですが、残念ながらうまくいきません。過去のPayaraでは動かせなかったこの機能、PayaraHazelcastSerializerでシリアライズ/デシリアライズ時にアプリケーション側のClassLoaderを差し替えることで実現しているのですが、https://github.com/payara/Payara/blob/payara-server-4.1.2.172/nucleus/payara-modules/hazelcast-bootstrap/src/main/java/fish/payara/nucleus/hazelcast/PayaraHazelcastSerializer.java#L61-L72その条件として、ApplicationRegistryからアプリケーションの情報が取得できることが必要です。Microでデプロイした場合、ApplicationRegistryにアプリケーションの情報が登録されないみたいで、実質PayaraHazelcastSerializerが機能せずに、ClassNotFoundExceptionとなります。Serviceを使って(どっちもHazelcastですが)分散処理ができるようになったことを、簡単に確認してみました。今回のものは分散処理というほどのものでもないですが、これと同じ理屈でAggregationsやMapReduceも使えるでしょう。Microで現状使えないのはちょっと残念ですが、このあたりができるようになったのは個人的には大きいかなと思います。4.1.153がリリースされまして。読者になる検索リンクはてなブログブログをはじめる週刊はてなブログはてなブログPro月別アーカイブはてなブログをはじめよう!Kazuhiraさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。