JAX-RS Lifecycle

Merhaba arkadaslar, bu yazımızda bir restful kaynağının yaşam döngüsünden bahsediyor olacağız.

Öncelikle hatırlamak gerekirse Jax-RS servisi sağlayan class’ımızın normal bir Java class’dan farklı olmadıgını, bazı annotationlarla özelleştirip servis sunabilecek hale getirdigimizi hatırlayalım.

Örnek olarak person apisi sunan bir rest servisimizin oldugunu varsayalım ve url template’in aşağıdaki biçimde oldugunu bilelim;

  • Root Resource, root url mapping yani. /person/api olsun.
  • HTTP methodları için ve temel crud işlemleri için ise şu methodların oldugunu varsayalım;
    * POST : /person/api/ post methodu Consumes olarak json tipte ve Person tipte bir Java bean aldıgını varsayalım.
    * DELETE : /person/api/{personId} delete methodu ise aldıgı person id’sini silen bir işlem yapıyor olacak.
    * PUT : /person/api/ UPDATE methodu, aldıgı Person Bean’ini update etsin.
    * GET : /person/api/{personId} methodu ilgili Person’u silsin.

Yukarıdaki api root path’e göre method url path’ler şöyle olacaktır, context name olarak projemizin RestfulTutorial adında olsun ve url mapping ile /rest url’den sonra gelecek olan istekleri restful karşılayacak şekilde oldugunu belirtelim. Bunlar önceki yazılarda mevcut;

  • POST : localhost:8080/RestfulTutorial/rest/person/api
  • DELETE : localhost:8080/RestfulTutorial/rest/person/api/{personId}
    Örnek bir delete path :localhost:8080/RestfulTutorial/rest/person/api/1122
  • PUT : localhost:8080/RestfulTutorial/rest/person/api/
  • GET : localhost:8080/RestfulTutorial/rest/person/api/1122
    Örnek bir get path :localhost:8080/RestfulTutorial/rest/person/api/1122

Dikkat ederseniz post ve put için aynı url path bulunuyor. Restful, hangi methodu çağıracağına ilgili methodun başında olan HTTP method tipini belirten annotationa göre belirleyecektir.

Şimdi bunu koda dökelim ve bakalım;

com.wora.rest.PersonService

web.xml

com.wora.servlet.ContextListener

 

com.wora.facade.ServiceFacade

com.wora.dao.person.IPersonDao

İmplementasyonuna bakalım;

com.wora.dao.person.PersonDaoImp

Göreceginiz üzere implementasyon var ama içi boş, doldurmadım

com.wora.db;

Not : Yazı sonunda proje’ye erişebileceğiniz link yer alacaktır.

 

Şimdi asıl konumuza gelelim ve root resource olan PersonService’in ne şekilde load oldugunu, lifecycle’ının ne olduguna deginmeye çalışalım;

Öncelikle default olarak bir root resourceun scope’u request scope’dur ve root resource yani örneğimizde /person/api  ile eşleşen her request için kaynak new’lenir. Normal bir java class oldugu icin constructor, member/instance variable’lar eklenebilir/düzenlenebilir. Constructor çağrıldıktan sonra injection yapılabilir hale gelmiş demektir. Requeste cevap dönültükten sonra ilgili kaynak hemen silinmez, referansı null’lanır ve garbace collector’a havale edilir. GB kendi çalışmasına göre ilgili kaynağı  silecektir.

Özetleyecek olursak eğer bir rest kaynagına istek geldiginde sırasıyla şu adımlar gerçekleşir;

  • Gelen istekteki url path ilgili class ile eşlenir.
  • Eşlenen rest class’ının constructoru çağrılır.
  • Dependencies inject edilir.
  • Uygun method çağrılır.
  • Resource, garbace collector için uygun hale getirilir.

Defualt olarak Request Scope ama okunaklı olması ve hatırda kalması adına belirtmek isterseniz class’ın başına @RequestScoped annotation’unu koymalısınız. Şöyle ki;

Request scope bazı durumlarda tercih edilmez, nedeni de performans düşüklüğü ve memory kullanımı’dır. Her request için rest resource oluşturulur, istek karşılanır ve gb için uygun hale getirilir ancak gb ne zaman çalışır bilinmez

Request scope yerine Singleton olarak resource’u değiştirebiliriz. Bu bize bir jax-rs applicationumuz var ise ilgili rest resource için tek instance olmasını sağlayacaktır. Bunun için rest class’ımızıa @Singleton annotationu koymamız ve Application’un bir instance’ı olması gerekmektedir. Şöyle ki;

Düşük kullanıcı sayısı ve network trafiğinde request scope ihtiyacınızı karşılacayaktır. Ancak kaynak kullanımında artış ve performans’da düşüş istemiyorsanız singleton olarak rest servisinizi dışarıya açabilirsiniz.

İlgili proje’ye şuradan erişebilirsiniz : RestfulTutorial

Yazımızın sonuna geldik, mutlu kalın.

~ A.Akkus

584 Total Views 1 Views Today