没有 Spring 的 AOP 和 JMX 问题 [英] Issue with AOP and JMX without Spring

查看:36
本文介绍了没有 Spring 的 AOP 和 JMX 问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个程序来跟踪使用 AspectJ 的应用程序的性能,要求可以在运行时使用 JMX 启用或禁用跟踪,以便我可以使用 jconsole/HtmlAdaptorServer 更改值.现在我必须再次将切入点保留在 AOP.xml 文件中,以便我们可以在需要时更改切入点.只要我在 aop .xml 文件中保留切入点,就什么也没有发生.下面是代码,请告诉我该怎么做或我遗漏了什么.

I wrote an program to trace the performance of an application using AspectJ with a requirement that the tracing can be enabled or disabled at runtime using JMX so that i can change the value using jconsole/HtmlAdaptorServer. Now again i have to keep the Pointcut in AOP.xml file so that we can change the poincut when need. As soon as I am kepping the pointcut in aop .xml file nothing happens.Below is the code please let me know what to do or what am I missing.

因为我在这里使用 JMX,所以我声明 MBean

Since I am using JMX here I am declaring MBean

    package com.ags.performance.asp;

    public interface SystemMonitoringAspectMBean {


    public void setEnabled(boolean enabled);
    public boolean isEnabled();
  }

这里我使用 MBean 并创建一个方面

Here I am using MBean and creating an Aspect

   package com.ags.performance.asp;

   //import ...
   import org.apache.log4j.Level;
   import org.apache.log4j.Logger;
   import org.aspectj.lang.ProceedingJoinPoint;
   import org.aspectj.lang.annotation.Around;
   import org.aspectj.lang.annotation.Aspect;
   import org.aspectj.lang.annotation.Pointcut;


   @Aspect
   public abstract class AbstractPerformanceMonitoringAspect
   implements SystemMonitoringAspectMBean{


    private Logger logger = Logger
            .getLogger(AbstractPerformanceMonitoringAspect.class);
    public volatile boolean enabled ;

    @Pointcut
    public abstract void monitoredOp();

    @Around("monitoredOp()&& !within(AbstractPerformanceMonitoringAspect)")
    public Object monitor(ProceedingJoinPoint pjp) throws Throwable {
        if (!isEnabled()) {
            return pjp.proceed();
        }
        long start = System.nanoTime();
        try {
            return pjp.proceed();
        } finally {
            long complete = System.nanoTime();
            logger.log(Level.INFO, "Operation "
                    + pjp.getSignature().toShortString() + " took "
                    + (complete - start) + " nanoseconds");
        }
    }

    public synchronized void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }

    public  synchronized boolean isEnabled() {
        return enabled;
    }
}

然后我正在创建代理,以便我可以在运行时更改值

Then I am creating Agent so that I can change the values at runtime

    package com.ags.performance.asp;


   import com.sun.jdmk.comm.HtmlAdaptorServer;
   import org.aspectj.lang.annotation.Aspect;
   import org.aspectj.lang.annotation.Pointcut;
   import javax.management.MBeanServer;
   import javax.management.ObjectName;
   import java.lang.management.ManagementFactory;

   @Aspect
  public class SystemMonitoringAspect extends AbstractPerformanceMonitoringAspect {
  @Pointcut
  public void monitoredOp() {
  }

public SystemMonitoringAspect(){

    MBeanServer mBeanServer = null;
    mBeanServer = ManagementFactory.getPlatformMBeanServer();

    HtmlAdaptorServer adapter = new HtmlAdaptorServer();

    ObjectName adapterName = null;
    ObjectName perfAspectBean = null;

    try
    {

        perfAspectBean = new ObjectName( "SystemMonitoringAspect:name=performAspectLogger" );
        mBeanServer.registerMBean( this, perfAspectBean );


        adapterName = new ObjectName( "SystemMonitoringAspect:name=htmladapter,port=9092" );

        adapter.setPort( 9092 );

        mBeanServer.registerMBean(adapter, adapterName);
        adapter.start();
    }
    catch( Exception e )
    {

        e.printStackTrace();
    }
}

public static void main(String[] args) {

    new SystemMonitoringAspect();


 }
}

将保存在 META_INF 文件夹中的 AOP.xml 文件

AOP.xml file which will be kept in META_INF folder

<aspectj>
<aspects>
    <!-- aspect name="com.ags.performance.asp.PerformanceLoggingAspect"/-->
     <aspect name="com.ags.performance.asp.SystemMonitoringAspect"/>

     <concrete-aspect 
            name="com.ags.performance.asp.SystemMonitoringAspect"      extends=
            "com.ags.performance.asp.AbstractPerformanceMonitoringAspect">
            <pointcut name="monitoredOp" expression="execution(* com.ags..*.*(..)"/>
     </concrete-aspect>
</aspects>
     <weaver options="-verbose –showWeaveInfo">

     </weaver>
</aspectj>

推荐答案

免责声明:我之前从未使用过 JMX,我只是对您的问题感兴趣,并快速阅读了 Oracle 的 JMX 教程.

Disclaimer: I have never used JMX before, I was just interested in your question and quickly read the beginning of Oracle's JMX Tutorial.

这里有一些非常简单但功能齐全的示例代码.它包含两个 MBean:

Here is some really simplistic, but fully functional sample code for you. It contains two MBeans:

  • 应用程序(只需设置 active = false 即可通过 JMX 退出应用程序)
  • 拦截器方面(单例实例化模型,(只需根据需要切换 active = falseactive = true 以通过 JMX 更改方面状态).
  • the application (just set active = false in order to quit the application via JMX)
  • the interceptor aspect (singleton instantiation model, (just toggle active = false or active = true as often as you wish in order to change the aspect state via JMX).

应用程序 MBean 接口:

package de.scrum_master.app;

public interface ApplicationMBean {
    void setActive(boolean active);
    boolean isActive();
}

应用:

package de.scrum_master.app;

import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;

public class Application implements ApplicationMBean {
    private boolean active = true;

    @Override public void setActive(boolean active) { this.active = active; }
    @Override public boolean isActive() { return active; }
    private void doSomething() { System.out.println("Application activity"); }

    public static void main(String[] args) throws Exception {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        Application application = new Application();
        ObjectName objectName = new ObjectName("de.scrum_master.app:type=Application");
        System.out.println("Registering application in JMX");
        mBeanServer.registerMBean(application, objectName);
        while (application.isActive()) {
            application.doSomething();
            Thread.sleep(3000);
        }
        System.out.println("Application was deactivated, exiting");
    }
}

拦截器方面 MBean 接口:

package de.scrum_master.aspect;

public interface ActivityInterceptorMBean {
    void setActive(boolean active);
    boolean isActive();
}

拦截器方面:

package de.scrum_master.aspect;

import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import de.scrum_master.app.Application;

public aspect ActivityInterceptor implements ActivityInterceptorMBean {
    private static boolean active = true;

    public ActivityInterceptor() throws Exception {
        MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName objectName = new ObjectName("de.scrum_master.aspect:type=ActivityInterceptor");
        System.out.println("Registering activity interceptor aspect in JMX");
        mBeanServer.registerMBean(this, objectName);
    }

    @Override public void setActive(boolean active) {
        ActivityInterceptor.active = active;
        System.out.println("Interceptor is now " + (active ? "active" : "inactive"));
    }
    @Override public boolean isActive() { return active; }

    before() : if(active) && execution(void Application.doSomething()) {
        System.out.println("Intercepted activity: " + thisJoinPointStaticPart);
    }
}

示例输出:

Registering application in JMX
Registering activity interceptor aspect in JMX
Intercepted activity: execution(void de.scrum_master.app.Application.doSomething())
Application activity
Intercepted activity: execution(void de.scrum_master.app.Application.doSomething())
Application activity
Intercepted activity: execution(void de.scrum_master.app.Application.doSomething())
Application activity
Interceptor is now inactive
Application activity
Application activity
Application activity
Interceptor is now active
Intercepted activity: execution(void de.scrum_master.app.Application.doSomething())
Application activity
Intercepted activity: execution(void de.scrum_master.app.Application.doSomething())
Application activity
Application was deactivated, exiting

这篇关于没有 Spring 的 AOP 和 JMX 问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆