Bu yazıda üzerinde uzun zamandır çalıştığım bir J2EE uygulamasında cache framework u olarak seçtiğimiz Oscache ve clustered bir yapıda oscache in built-in desteklediği jgroups-JMS clustering support yeteneğini kullanmak yerine HTTPClient kullanarak uyguladığım workaround dan bahsetmeye çalışacağım. Oscache jsp sayfalarını , servlet responselarını , java nesnelerini cacheleyebileceginiz open source bir cache kütüphanesidir. oscache i clustered environment ta kullanabilmeniz için , oscache içerisinde built-in gelen jgroups veya JMS ten bir tanesini seçmek durumundasınız.Benim seçimim konfigurasyonu kolay olan jgorups tan yana oldu (Bu arada JMS kullanabilmek için application server üzerinde JMS tanımı yapmak gerekmekte , application server tarafında Tomcat değilde Weblogic yada Websphere gibi ticari bir ürün kullanıyor olsam , sanırım bu ilk tercihim olurdu.) oscache - jgorups entegrasyonu icin yapmamız gereken tek şey (Oscache in cok zayıf dökümantasyonunda yazdığını söylüyorum) oscache.properties dosyasında yer alan aşağıdaki satırın commentinin kaldırılması ve jgroups-all.jar dosyasını class-path ' e eklenmesi. #cache.event.listeners=com.opensymphony.oscache.plugins.clustersupport. JavaGroupsBroadcastingListener Elbetteki çalışmadı :) , burayı fazlaca uzatmadan bunun çalışabilmesi için yaptığımız konfigurasyona geçip ,
{
(route add -net 224.0.0.0 netmask 240.0.0.0 dev ETHERNET_CARD_NAME) komutu işletim sisteminde çalıştırılıp , oscache.properties dosyasına aşağıdaki satırı ekleyin. cache.cluster.multicast.ip=224.0.0.0 }
Bundan sonraki kısım , bizim cluster desteği için uyguladigimiz workaround ile ilgili.
oscache clustering destegini yanlızca cache teki nesnelerin flush edilmesi(cache teki nesnenin ömrünün dolduğunun belirtilmesi) sinyalini cluster yapıdaki node lara broadcast yöntemiyle taşıyarak gerçekleştirmekte , bunun anlamı , cache te bulunan bir nesne , bir makine da değiştiği zaman , bu nesnenin diğer makinalardaki cache lere taşınması söz konusu değil , taşınan yanlızca cache teki nesnenin çöpe atılması gerektiği sinyali. Bu basit clustering desteğini manuel elde edebilmek için ;
· Uygulamaya yeni bir servlet ekleyin , (örn:CacheControler vs..) · Sistemden ürettiğiniz cacheInvalidate event larını , httpClient yardımı ile bu servletlere(tum clusterlara) taşıyın , · Servlet içerisinde invalidate işlemini gerçekleştirin · Aşağıda bu işlemi gerçekleştirebilmek için yazmanız gereken kod parçaları yer almakta , *uygulama içerisinde cache invalidate event ları oluşturan kod parçasında yapılması gereken for(int i=0;i<clusterize;i++){ HttpClient httpClient = new HttpClient(); PostMethod postMethod = new PostMethod(servletClusterUrl_i); NameValuePair[] data = { new NameValuePair("key", cache_key_name)}; postMethod.setRequestBody(data); httpClient.executeMethod(postMethod);
} *Servlet tarafında yapılması gereken try { String node = request.getParameter("key"); if(node != null){ if(node.equals("all")) CacheAdmin.instance().getCacher().flushAll(); else CacheAdmin.instance().getCacher().flushEntry(node); } }catch(Exception ex){ ExceptionHandler.logException(ex); } } ** Tabi servletinizi güvenli bir alanda tutmayı unutmayın. |