play - 2.2-Java:QOS:如何在开始时记录事件(之前)&使用注释,动作的方法结束(之后)?

时间:2014-02-20 20:05:46

标签: playframework playframework-2.0 playframework-2.2

我想在方法的开始和结束时生成事件以记录QOS&的时间戳。仪表目的。在Spring框架中,使用AOP很容易实现,而无需在每种方法中编写锅炉板代码。

我想在游戏中做类似的事情。我看着行动& @with注释然而它没有给出期望的结果。

记录事件的最佳方法是什么?开始(之前)和完成(之后)方法的时间戳?

以下是我的动作类:

import play.libs.F.Promise;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.SimpleResult;

public class PublishEventAction extends Action<PublishEvent> {

    @Override
    public Promise<SimpleResult> call(Http.Context context) throws Throwable
    {


        try { 
            before(context); 
            Promise<SimpleResult> result = delegate.call(context); // This part calls your real action method 
            after(context); 
            return result; 
          } catch (RuntimeException e) { 
            throw e; 
          } catch (Throwable t) { 
            throw new RuntimeException(t); 
          } 


    }

    private void before(Http.Context context) { 
        // Do the before things here

        System.out.println("Before: " + context.request().path()+context.toString()+"current time : "+System.currentTimeMillis());
      } 

      private void after(Http.Context context) { 
        // Do the after things here
          System.out.println("After: " + context.request().path()+context.toString()+"current time : "+System.currentTimeMillis());
      } 

}

提前致谢!

4 个答案:

答案 0 :(得分:1)

您可以在请求之前和之后拦截,如下所示,并记录您的所有请求:

public Action onRequest(final Http.Request request, Method method) {

    Action action =  new Action.Simple() {
        public Promise<Result> call(Http.Context ctx) throws Throwable {
            Long start = System.currentTimeMillis();
            Promise<Result> result = delegate.call(ctx);

            //This part is not executed immediately
            Long finish = System.currentTimeMillis();
            Logger.info("method=" + request.method() + " uri=" + request.uri() + " remote-address=" + request.remoteAddress() + " time=" + (finish-start));

            return result;
        }
    };
    return action;
}

答案 1 :(得分:0)

您可以定义action composition。在游戏文档中解释了如何在触发操作之前执行任何代码。但您也可以像Google Groups中描述的那样使用AFTER。

答案 2 :(得分:0)

您可以在“app”包的根目录下创建一个扩展GlobalSettings的Global类,并拦截每个请求:

public class Global扩展GlobalSettings {

public Action onRequest(Request request, Method actionMethod) {
    Logger.debug("Request starts:" + request.toString());
    Action action = super.onRequest(request, actionMethod);
    Logger.debug("Request ends.");

    return action;
}

}

答案 3 :(得分:0)

如前所述,您希望扩展Global Settings对象。

Play的文档非常可靠:Application Global SettingsIntercepting Requests

import play.*;
import play.mvc.Action;
import play.mvc.Http.Request;
import java.lang.reflect.Method;

public class Global extends GlobalSettings {

    public Action onRequest(Request request, Method actionMethod) {
        System.out.println("before each request..." + request.toString());
        return super.onRequest(request, actionMethod);
    }

}

文档说明如果要拦截特定操作,可以使用action composition执行此操作。