Seam – Interceptor ler

Seam Interceptors

Seam Interceptors

Aspect Oriented uygulamalar için Seam içerisinde yer default interceptor ler haricinde kendi interceptor mimarinizi yazabilirsiniz. Aşağıda bununla ilgili bir örnek bulunmakta. Bu örnekte uygulamamızdaki metodların performansları console ekranına basılıyor.

Tanımı @Interceptor ile yapabiliriz. Burada @AroundInvoke ile tanımlanan metod aspect in çağırıldığı yerdir. Buna göre invocation.proceed() metodunda çağırımı gerçekleşiyor. Bu arada metod başlangıç ve bitişinde geçen süreyi alıp diğer bilgilerle birlikte yazdırıyoruz. Bunun haricinde around ile interceptor un hangi interceptor lerden sonra çalışacağınu belirtiyoruz.

    package com.mergecons.deneme.session;
     
    import org.jboss.seam.annotations.intercept.AroundInvoke;
    import org.jboss.seam.annotations.intercept.Interceptor;
    import org.jboss.seam.core.BijectionInterceptor;
    import org.jboss.seam.core.ConversationInterceptor;
    import org.jboss.seam.ejb.RemoveInterceptor;
    import org.jboss.seam.intercept.AbstractInterceptor;
    import org.jboss.seam.intercept.InvocationContext;
     
    @Interceptor(stateless = true, around = { BijectionInterceptor.class,
      ConversationInterceptor.class }, within = RemoveInterceptor.class)
    public class PerformansKontrolInterceptor extends AbstractInterceptor {
     private static final long serialVersionUID = 1L;
     
     @AroundInvoke
     public Object aroundInvoke(final InvocationContext invocation)
       throws Exception {
      final String methodName = invocation.getMethod().getName();
      final String className = invocation.getTarget().getClass().getName();
     
      final long baslangic = System.currentTimeMillis();
      final Object result = invocation.proceed();
      final long bitis = System.currentTimeMillis();
     
      final double gecenSure = (bitis – baslangic);
     
      System.out.println("Cagirilan metod : " + className + "::" + methodName + " \t Gecen Sure : " + gecenSure);
      return result;
     }
     
     public boolean isInterceptorEnabled() {
      return true;
     }
    }

Peki bu interceptor ün ne zaman çalışacağını nerede belirleyeceğiz ? Bunu yapmak için bir kaç yöntem var.
Birincisi aşağıdaki gibi bir annotation ile belirli sınıfların dinlenmesini sağlayabiliriz.

    package com.mergecons.deneme.session;
     
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
     
    import org.jboss.annotation.internal.DefaultInterceptorMarker;
    import org.jboss.seam.annotations.intercept.Interceptors;
     
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Interceptors(PerformansKontrolInterceptor.class)
    @DefaultInterceptorMarker
    public @interface DemoControl {
     
    }

Örnek verilirsede aşağıdaki gibi bir component içerisinde interceptor ün devreye girilmesi sağlanabilir. Bu durumda siparisHome içerisindeki metodların çağırımlarında interceptor devreye girecektir.

    @Name("siparisHome")
    @DemoControl
    public class SiparisHome extends EntityHome<Siparis>
    {
     …
    }

Peki tüm component ler için interceptor ün devreye girmesi istenirse ? Bu durumda component.xml içerisinde aşağıdaki gibi tanım yapılabilir.

    <core:init debug="true" jndi-pattern="@jndiPattern@">
     <core:interceptors>
      <value>com.mergecons.deneme.session.PerformansKontrolInterceptor</value>
    </core:interceptors>
Aug 4th, 2011
  1. M.Sait Özen
    Aug 5th, 2011 at 07:59 | #1

    Güzel bir yazı. Klavyenize sağlık…

  2. Aug 5th, 2011 at 09:58 | #2

    Eyvallah hocam sagolasin :)

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>