[OSB, Coherence] OSB Result Cache Invalidation from C++ Client
Rabu, 30 Januari 2013
0
komentar
https://blogs.oracle.com/jaylee/entry/osb_result_cache_invalidation_from
[訳注]
この方法はサポートされていません。参考にされるのは結構ですが、あくまでも自己責任でお願いします。
最近お客様よりOSB結果キャッシュのデータを無効化したい、との問い合わせを受けました。データを無効かするキーを作成する方法はないので、取り得る最善の方策はフィルタを使うことです。コードスニペットを以下に記載します。
ここで一つ問題があります。それは、ビジネスサービスのどの結果を無効化すべきかわからないということです。2個のビジネスサービスがたまたま同じトークンを持っている場合、これは両方のトークンを削除することになって望ましいことではありません。また、インデックスが所定の位置にないため、キャッシュサイズが巨大である場合、パフォーマンスの課題も考えられます。現在のところ、Keyのクラスを作成する方法はわかっていません。独力でやってみようとしましたが、どういうわけか、作成したものとOSBが生成したものが異なっていました。そのため、最後には自作のResultCacheロジックを作成し、この目的を達成したのです。extern "C" void invalidate(char* key) {
try {
String::View vsCacheName = "/osb/service/ResultCache";
NamedCache::Handle hCache = CacheFactory::getCache(vsCacheName);
ValueExtractor::Handle hExtractor = KeyExtractor::create(ReflectionExtractor::create("getToken"));
Filter::View vEqualsFilter = EqualsFilter::create(hExtractor, String::create(key));
hCache->invokeAll(vEqualsFilter, ConditionalRemove::create(AlwaysFilter::getInstance(),true));
}
catch (const std::exception& e) {
std::cerr << "error: " << e.what() << std::endl;
}
}
public class ResultCacheHelper {
private static String CACHE_NAME = "dist-test";
public static void put(String key, org.apache.xmlbeans.XmlObject value) throws IOException {
NamedCache cache = CacheFactory.getCache(CACHE_NAME);
cache.put(key, serialize(value));
CacheFactory.log("Cache Key : " + key + " is put in Cache!:" + serialize(value).toString());
}
public static org.apache.xmlbeans.XmlObject get(String key) throws IOException, ClassNotFoundException, XmlException {
XmlObject result;
NamedCache cache = CacheFactory.getCache(CACHE_NAME);
byte[] bytes = (byte[]) cache.get(key);
if(bytes == null) {
String xmlNull = "null ";
result = org.apache.xmlbeans.XmlObject.Factory.parse(xmlNull);
CacheFactory.log("Cache Key : " + key + " is not found in Cache!");
}
else {
result = (org.apache.xmlbeans.XmlObject)deserialize(bytes, Thread.currentThread().getContextClassLoader());
CacheFactory.log("Cache Key : " + key + " is found in Cache!:"+result.toString());
}
return result;
}
protected static Object deserialize(byte[] bytes, final ClassLoader cl) throws IOException, ClassNotFoundException {
ObjectInputStream ois = null;
try {
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
ois = new ObjectInputStream(bais) {
protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
return Class.forName(desc.getName(), false, cl);
}
};
return ois.readObject();
}
finally {
if (ois != null) ois.close();
}
}
protected static byte[] serialize(Object object) throws IOException {
ObjectOutputStream oos = null;
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
return baos.toByteArray();
}
finally {
if (oos != null) oos.close();
}
}
}
これで、キャッシュを無効化することができます。
近い将来OSBのキャッシュ無効化機能が追加されると信じています。String::View deleteKey = key;
String::View vsCacheName = "dist-test";
NamedCache::Handle hCache = CacheFactory::getCache(vsCacheName);
hCache->remove(deleteKey);
TERIMA KASIH ATAS KUNJUNGAN SAUDARA
Judul: [OSB, Coherence] OSB Result Cache Invalidation from C++ Client
Ditulis oleh Unknown
Rating Blog 5 dari 5
Semoga artikel ini bermanfaat bagi saudara. Jika ingin mengutip, baik itu sebagian atau keseluruhan dari isi artikel ini harap menyertakan link dofollow ke https://apk-zipalign.blogspot.com/2013/01/osb-coherence-osb-result-cache.html. Terima kasih sudah singgah membaca artikel ini.Ditulis oleh Unknown
Rating Blog 5 dari 5
0 komentar:
Posting Komentar