我想在方法的开始和结束时生成事件以记录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());
}
}
提前致谢!
答案 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 Settings和Intercepting 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执行此操作。