我编写了一个程序来跟踪使用AspectJ的应用程序的性能,并要求可以在运行时使用JMX启用或禁用跟踪,以便我可以使用jconsole / HtmlAdaptorServer更改值。现在我必须将Pointcut保留在AOP.xml文件中,以便我们可以在需要时更改poincut。一旦我在aop .xml文件中点击切入点没有任何反应。下面是代码,请让我知道该做什么或我错过了什么。
由于我在这里使用JMX,我宣布MBean
package com.ags.performance.asp;
public interface SystemMonitoringAspectMBean {
public void setEnabled(boolean enabled);
public boolean isEnabled();
}
这里我使用MBean并创建一个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;
}
}
然后我创建Agent以便我可以在运行时更改值
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文件夹中
<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>
答案 0 :(得分:3)
免责声明:我之前从未使用过JMX,我只是对您的问题感兴趣并快速阅读Oracle's JMX Tutorial的开头。
以下是一些非常简单但功能齐全的示例代码。它包含两个MBean:
active = false
以便通过JMX退出应用程序)active = false
或active = true
,以便通过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