5.5. リモートキャッシュのカスタムリスナー
リモートキャッシュのカスタムリスナーは、埋め込みキャッシュと同様に登録できますが、
sync=false が存在する必要があります。例を以下に示します。
Java のみを使用
from(infinispan://?cacheContainer=#cacheManager&sync=false&customListener=#myCustomListener")
.to(mock:result);
Blueprint および Java を使用
Java クラス:
public class RemoteCacheManagerFactory {
ConfigurationBuilder clientBuilder;
public RemoteCacheManagerFactory(String hostname, int port) {
clientBuilder = new ConfigurationBuilder();
clientBuilder.addServer()
.host(hostname).port(port);
}
public RemoteCacheManager newRemoteCacheManager() {
return new RemoteCacheManager(clientBuilder.build());
}
}
<bean id=”remoteCacheManagerFactory” class=“com.jboss.datagrid.RemoteCacheManagerFactory”>
<argument value=”localhost”/>
<argument value="11222”/>
</bean>
<bean id=”cacheManager”
factory-ref=”remoteCacheManagerFactory”
factory-method=“newRemoteCacheManager”>
</bean>
<bean id="myCustomListener" class="org.example.com.CustomListener"/>
<camelContext id="route" xmlns="http://camel.apache.org/schema/blueprint">
<route>
<from uri="infinispan://?cacheContainer=#cacheManager&sync=false&customListener=#myCustomListener"/>
<to uri="mock:result"/>
</route>
</camelContext>
myCustomListener のインスタンスが存在する必要があります。ユーザーは org.apache.camel.component.infinispan.remote.InfinispanRemoteCustomListener クラスを拡張し、結果となるクラスに @ClientListener アノテーションを付けることが推奨されます。このアノテーションは org.infinispan.client.hotrod.annotation にあります。
リモートリスナーも以下のようにカスタムフィルターおよびコンバーターと関連付けられることがあります。
@ClientListener(includeCurrentState=true, filterFactoryName = "static-filter-factory", converterFactoryName = "static-converter-factory")
private static class MyCustomListener extends InfinispanRemoteCustomListener {
}
カスタムフィルターまたはコンバーターを使用するには、
@NamedFactory アノテーションが付けられたクラスを実装する必要があります。必要なメソッドを実装するスケルトンは以下のとおりです。
import org.infinispan.notifications.cachelistener.filter;
@NamedFactory(name = "static-converter-factory")
public static class StaticConverterFactory implements CacheEventConverterFactory {
@Override
public CacheEventConverter<Integer, String, CustomEvent> getConverter(Object[] params) {
...
}
static class StaticConverter implements CacheEventConverter<Integer, String, CustomEvent>, Serializable {
@Override
public CustomEvent convert(Integer key, String previousValue, Metadata previousMetadata,
String value, Metadata metadata, EventType eventType) {
...
}
}
}
@NamedFactory(name = "static-filter-factory")
public static class StaticCacheEventFilterFactory implements CacheEventFilterFactory {
@Override
public CacheEventFilter<Integer, String> getFilter(final Object[] params) {
...
}
static class StaticCacheEventFilter implements CacheEventFilter<Integer, String>, Serializable {
@Override
public boolean accept(Integer key, String previousValue, Metadata previousMetadata,
String value, Metadata metadata, EventType eventType) {
...
}
}
}
カスタムフィルターおよびコンバーターはサーバーに登録する必要があります。これらのクラスの登録については、『Red Hat JBoss Data Grid Developer Guide』 の
Remote Event Listeners の項を参照してください。
注記
リモート HotRod イベントをリッスンするには、cacheManager のタイプが
RemoteCacheManager で、インスタンス化される必要があります。