我写了一个程序来跟踪使用AspectJ与跟踪可以启用或使用JMX在运行时禁用,这样我就可以改变使用jconsole / HtmlAdaptorServer值要求的应用程序的性能。 现在,我又必须保持在切入点aop.xml中的文件,这样我们可以改变时poincut需要。 只要我在kepping AOP .xml文件没有切入点happens.Below是代码,请让我知道该怎么做还是我失去了什么。
由于我在这里使用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>