Java 没有Spring的AOP和JMX问题
我编写了一个程序,使用AspectJ跟踪应用程序的性能,要求可以在运行时使用JMX启用或禁用跟踪,以便使用jconsole/HtmlAdaptorServer更改值。现在,我必须再次将切入点保存在AOP.xml文件中,以便在需要时更改切入点。只要我在aop.xml文件中点击切入点,什么都不会发生。下面是代码,请告诉我该做什么或我遗漏了什么 因为我在这里使用JMX,所以我要声明MBeanJava 没有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
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:
- 应用程序(只需设置
,即可通过JMX退出应用程序)active=false
- 拦截器方面(单例实例化模型,(只要根据需要频繁切换
或active=false
,即可通过JMX更改方面状态)active=true
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())
应用程序活动
应用程序已停用,正在退出