EJB学習ノート6(EJBのブロック)

3431 ワード


 1.前言
ブロッキングを聞くと、特にサーブレット仕様では、ブロッキングの概念を十分に応用していると推定されます.EJB 3もブロッキングのサポートを提供し、本質的に軽量レベルのAOP実現であり、ブロッキングは複数の業務方法の中の汎用論理を業務方法から抽出し、ブロッキングに置いて実現することができ、それによって素晴らしいコード多重化を実現する.
 2.EJBのブロッキング
SpringでのAOPインプリメンテーションでは@Before,@AfterReturning,@AfterThrowingなど大量のAnnotationが提供されており,これらの注釈は機能豊富な拡張処理を定義するために用いられるが,EJBのブロッキングでは完全なAOPを実現するつもりはなく,@AroundInvoke Annotationが1つ提供されているだけで,機能は限られている.
 3.ブロッキングの定義
@AroundInvokeを使用してブロッキングメソッドを修飾するだけで、EJBでブロッキングを定義するのは簡単です.
ブロッキングクラス
package com.Interceptor;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class HelloInterceptor {
	
	 @AroundInvoke
	    public Object log(InvocationContext ctx) throws Exception {
	        System.out.println("*** HelloInterceptor intercepting");
	        long start = System.currentTimeMillis();
	        try{
	            if (ctx.getMethod().getName().equals("SayHello")){
	                System.out.println("*** SayHello     ! *** " );
	            }            
	            if (ctx.getMethod().getName().equals("Myname")){
	                System.out.println("*** Myname     ! *** " );
	            }            
	            return ctx.proceed();
	        }catch (Exception e) {
	            throw e;
	            
	        }finally {
	            long time = System.currentTimeMillis() - start;    
	            System.out.println("  :"+ time + "ms");
	        }
	    }
}

解析:上記のコードから、このブロッキングはインタフェースを実装する必要がなく、またはベースクラスを継承する必要がなく、@AroundInvokeAnnotationでブロッキングクラスをマークする方法だけでよいことがわかります.ブロッキングメソッドは、次のフォーマットを満たす必要があります.
public Object XXX(InvocationContext ctx) throws Exception
修飾クラス
package com.Interceptor;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.interceptor.ExcludeClassInterceptors;
import javax.interceptor.Interceptors;

@Stateless
@Remote (HelloChinaRemote.class)
@Interceptors(HelloInterceptor.class)
public class HelloChinaBean implements HelloChinaRemote {

    public String SayHello(String name) {
        return name +"  ";
    }

    //   ,      ,       
    @ExcludeClassInterceptors
    public String Myname() {        
        return "    ";
    }
    
    
    //         
 /*   @AroundInvoke
    public Object log(InvocationContext ctx) throws Exception {
        System.out.println("*** HelloInterceptor intercepting");
       
        long start = System.currentTimeMillis();
        try{
            if (ctx.getMethod().getName().equals("SayHello")){
                System.out.println("*** SayHello     ! *** " );
            }            
            if (ctx.getMethod().getName().equals("Myname")){
                System.out.println("*** Myname     ! *** " );
            }            
            return ctx.proceed();
        }catch (Exception e) {
            throw e;
            
        }finally {
            long time = System.currentTimeMillis() - start;    
            System.out.println("  :"+ time + "ms");
        }
    }*/
}

 4.小結
1.ブロッククラスを定義します.特別な点はありません.@AroundInvokeを使用してpublic Object XXX(InvocationContext ctx)throws Exception署名を持つ方法を修飾すればいいです.
2.ブロックする必要があるすべてのEJB 3のBean実装クラス、ビジネスメソッドに@Interceptors修飾を使用
3.EJBのビジネス・メソッドをブロックから除外する場合は、@ExcludeClassInterceptorsを使用してメソッドを修飾します.