Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 没有Spring的AOP和JMX问题_Java_Aop_Aspectj_Jmx - Fatal编程技术网

Java 没有Spring的AOP和JMX问题

Java 没有Spring的AOP和JMX问题,java,aop,aspectj,jmx,Java,Aop,Aspectj,Jmx,我编写了一个程序,使用AspectJ跟踪应用程序的性能,要求可以在运行时使用JMX启用或禁用跟踪,以便使用jconsole/HtmlAdaptorServer更改值。现在,我必须再次将切入点保存在AOP.xml文件中,以便在需要时更改切入点。只要我在aop.xml文件中点击切入点,什么都不会发生。下面是代码,请告诉我该做什么或我遗漏了什么 因为我在这里使用JMX,所以我要声明MBean package com.ags.performance.asp; public interf

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

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

    package com.ags.performance.asp;

    public interface SystemMonitoringAspectMBean {


    public void setEnabled(boolean enabled);
    public boolean isEnabled();
  }
这里我使用MBean并创建一个方面

   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;
    }
}
然后我创建代理,以便在运行时更改值

    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文件

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

下面是一些非常简单但功能齐全的示例代码。它包含两个MBean:

  • 应用程序(只需设置
    active=false
    ,即可通过JMX退出应用程序)
  • 拦截器方面(单例实例化模型,(只要根据需要频繁切换
    active=false
    active=true
    ,即可通过JMX更改方面状态)
应用程序MBean接口:

package de.scrum\u master.app;
公共接口应用程序bean{
void setActive(布尔激活);
布尔isActive();
}
应用程序:

package de.scrum\u master.app;
导入java.lang.management.ManagementFactory;
导入javax.management.MBeanServer;
导入javax.management.ObjectName;
公共类应用程序实现ApplicationBean{
private boolean active=true;
@重写公共void setActive(布尔活动){this.active=active;}
@重写公共布尔isActive(){return active;}
私有void doSomething(){System.out.println(“应用程序活动”);}
公共静态void main(字符串[]args)引发异常{
MBeanServer MBeanServer=ManagementFactory.getPlatformMBeanServer();
应用程序=新应用程序();
ObjectName ObjectName=newobjectname(“de.scrum_master.app:type=Application”);
System.out.println(“在JMX中注册应用程序”);
registerMBean(应用程序,对象名);
while(application.isActive()){
application.doSomething();
睡眠(3000);
}
System.out.println(“应用程序已停用,正在退出”);
}
}
拦截器方面MBean接口:

package de.scrum\u master.aspect;
公共接口活动拦截器MBean{
void setActive(布尔激活);
布尔isActive();
}
拦截器方面:

package de.scrum\u master.aspect;
导入java.lang.management.ManagementFactory;
导入javax.management.MBeanServer;
导入javax.management.ObjectName;
导入de.scrum_master.app.Application;
公共方面ActivityInterceptor实现ActivityInterceptorMBean{
私有静态布尔活动=true;
public ActivityInterceptor()引发异常{
MBeanServer MBeanServer=ManagementFactory.getPlatformMBeanServer();
ObjectName ObjectName=newobjectname(“de.scrum_master.aspect:type=ActivityInterceptor”);
System.out.println(“在JMX中注册活动拦截器方面”);
registerMBean(这个,objectName);
}
@覆盖公共无效设置活动(布尔活动){
ActivityInterceptor.active=活动;
System.out.println(“拦截器现在是”+(活动的?“活动的”:“不活动的”);
}
@重写公共布尔isActive(){return active;}
before():if(活动)和执行(void Application.doSomething()){
System.out.println(“截获的活动:“+thisJoinPointStaticPart”);
}
}
样本输出:

在JMX中注册应用程序
在JMX中注册活动侦听器方面
截获的活动:执行(void de.scrum\u master.app.Application.doSomething())
应用程序活动
截获的活动:执行(void de.scrum\u master.app.Application.doSomething())
应用程序活动
截获的活动:执行(void de.scrum\u master.app.Application.doSomething())
应用程序活动
拦截器现在处于非活动状态
应用程序活动
应用程序活动
应用程序活动
拦截器现在处于活动状态
截获的活动:执行(void de.scrum\u master.app.Application.doSomething())
应用程序活动
截获的活动:执行(void de.scrum\u master.app.Application.doSomething())
应用程序活动
应用程序已停用,正在退出