Pivotal GemFire 9.0.3 を Spring Data Gemfire 2.0.0 M3 で弄る機会がありまして、ちょっと個人的にはまったことについてメモです。
Spring Data Gemfire + Spring Boot で Spring Bootable な cache-config.xml なしのアプリを記述するのがクールかもしれないけど、とりあえず Pivotal GemFire の cache.xml 設定を Spring Data Gemfire の cache-config.xml に移植してみようと思いまして、PDX 設定でちょっとはまりました。
cache.xml で以下の感じで、ReflectionBasedAutoSerializer を使って何も考えずにパッケージが io.quitada.* なクラスから生成されたオブジェクトをシリアライズ・デシリアライズする設定がありがちですね。
<pdx read-serialized="false"> <pdx-serializer> <class-name> com.gemstone.gemfire.pdx.ReflectionBasedAutoSerializer </class-name> <parameter name="classes"> <string>io.quitada.*</string> </parameter> </pdx-serializer> </pdx>
これを Spring Data Gemfire の cache-config.xml で表現したいと思ったわけです。Spring Data Gemfire の場合はまず、cache の設定の属性として PDX 関連の設定をして、シリアライザークラスは別途 Bean を定義して pdx-serializer-ref に当該 Bean ID を指定、シリアライズ対象クラスは定義した Bean の constructor-arg に指定しておくと良いみたいです。
<gfe:client-cache id="client-cache" properties-ref="client-properties" pool-name="myPool" pdx-read-serialized="false" pdx-serializer-ref="pdxAutoSerializer" /> <bean id="pdxAutoSerializer" class="org.apache.geode.pdx.ReflectionBasedAutoSerializer"> <constructor-arg value="io.quitada.*" /> </bean>
はまったのはシリアライズ対象クラスの設定方法です。これ、ドキュメントに書いてますかねー?ぐはぁ…。こちらに設定例ありますが…。
対象クラス指定を複数行う場合(GemFire の cache.xml はカンマ区切りでこれもあまりドキュメントにきちんと書いてないような…)、以下のように array を使ってやると良いみたいです。
<bean id="pdxAutoSerializer" class="org.apache.geode.pdx.ReflectionBasedAutoSerializer"> <constructor-arg> <array> <value>io.quitada1.*</value> <value>io.quitada2.*</value> <value>io.quitada3.*</value> </array> </constructor-arg> </bean>