Aylık Arşiv: Şubat 2012

Play! Framework önbelleğini güncel tutmak

Bu videoda veritabanı kayıtları güncellendiğinde Play! Framework önbelleğini de güncellemek adına iki farklı yöntem öneriyorum. Bu yöntemlerin ilki Model sınıfında save metodunu override etmek, diğeri ise JPA olaylarını dinleyen bir plugin yazmak. Uygulamanın kodlarına buradan erişebilirsiniz. İyi seyirler!

Güncelleme (11 Mart 2011)
Play! Framework Türkiye Google Grubu‘nda Ahmet Alp Balkan şöyle bir yorumda bulunmuş. Buraya da not düşmek istedim.

Bir noktada serializable alan metoda kabul ettirmek icin ArrayList olarak degistirmissiniz List olan bir variable’i. Neyin gelmedigini bilmediginiz durumlarda (ornegin JPA cogu metodu List donduruyor ama tipi soylemeyebiliyor, bu yuzden ArrayList yazamayabilirsiniz bu ornekteki gibi), butun list’leri (Serializable)’a guvenle cast edebilirsiniz, tum standard API List implementasyonlari serializable oldugu icin.



Play! Framework ile etkin önbellek yönetimi

Bu videoda Play! Framework önbelleğini etkin yönetebilmek adına bir yöntem öneriyorum ve veritabanı istatistiklerini 5 dakikada bir yenilenecek şekilde önbellekte tutan bir örnek veriyorum. Yöntemin eksiklerini ya da hatalarını gidermek üzere yorumlarınızı okumaktan memnun olurum. Uygulamanın kodlarına buradan erişebilirsiniz. İyi seyirler!



Play! Framework Türkiye mail listesinde konuyu tartışırken CacheManager sınıfını daha da iyileştirdik.

Controller içerisinden istatistiklere erişmek için aşağıdaki kod yeterli oluyor.

Play! Framework ile indirmeyi durdur/sürdür desteği

Şu sıralar geliştirmekte olduğum bir uygulamada kullanıcıların oldukça büyük dosyaları indirebilmelerini sağlıyorum. Dosya boyutları sıklıkla 1GB’ın üzerinde olabiliyor. Her indirme isteğinden önce uygulama, kullanıcının o dosyayı indirme yetkisi olduğunu doğruluyor ve doğrulama başarılı ise indirmeye izin veriyor. Diğer bir deyişle dosyalar statik olarak değil aksine dinamik olarak sunuluyor. Web sunucu olarak Apache HTTP proxy arkasında çalışan ve Play! Framework 1.2.4 içerisinde gelen Netty HTTP sunucuyu kullanıyorum.

Dosya boyutlarının oldukça fazla olduğundan bahsetmiştim. Bu durumda kullanıcıların indirme işlemine herhangi bir sebeple oluşan kesintinin ardından kaldıkları yerden devam etmeleri büyük önem kazanıyor. Flashget ya da DownThemAll! gibi indirme yöneticileri kullanıcılarına bu imkanı veriyorlar. Fakat söz konusu süreç yalnızca istemci tarafında bitmiyor. Eğer web sunucu bu desteği vermiyorsa durdur/sürdür(pause/resume) işlemi gerçekleşemiyor. Bu işlem için HTTP protokolünün Range başlığı kullanılıyor. Ayrıca sunucunun istemciye Range başlığını kabul ettiğini belirtmek için Accept-Ranges başlığını göndermesi gerekiyor. Aslında tüm bu süreç hem Apache HTTP server hem de Netty server tarafından destekleniyor. Fakat dosyaları statik sunmadığınız zaman durum ne yazık ki değişiyor.

Play! Framework ile gelen renderBinary() metodu binary dosyaları istemciye gönderebilmeniz için hem yalın hem de çok kullanışlı bir özellik olsa da Range başlığı desteği sunmuyor. Konu üzerinde biraz araştırma yaptığımda kuyrukta bekleyen bir pull isteğine rastladım. Söz konusu yama renderBinary metoduna Range başlığı desteği ekliyor. Ancak yama henüz kuyrukta olduğundan en erken bir sonraki Play! Framework sürümüne dahil edilecek.

Durum böyle olunca kendi başımın çaresine bakmak durumunda kaldım. HTTP protokolüne uygun şekilde bir gerçekleme yaptım ve DownThemAll! ile başarılı sonuç aldım. Böylece kullanıcılarım birden fazla thread ile dosya indirme ve indirmeyi durdurup sürdürme imkanına kavuştular. Gereken kodları içeren bir gist hazırladım. Aşağıda paylaşıyorum.