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

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

问题描述

我编写了一个程序来跟踪使用AspectJ的应用程序的性能,并要求可以在运行时使用JMX启用或禁用跟踪,以便可以使用jconsole/HtmlAdaptorServer更改值.现在我再次将Pointcut保留在AOP.xml文件中,以便我们可以在需要时更改poincut.在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();


 }
}

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

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,我只是对您的问题感兴趣,并迅速阅读了

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天全站免登陆