在ActiveMQ中的监控和管理也可以通过Advisory实现对消息生产者和消息消费者以及队列的监控。Advisory实质通过事件监听实现。
调用过程的序列图如下:
1.在Advisory中实现对队列目标的监控:
A.队列目标的事件类:DestinationEvent继承EventObject实现对DestinationInfo的监控。
B.通过队列目标的监听实现对队列事件的监控
public interface DestinationListener {
void onDestinationEvent(DestinationEvent event);
}
C.通过DestinationSource类实现对Broker中队列目标Destination的跟踪。
2.在Advisory中实现对消费者的监控:
A.通过抽象类ConsumerEvent实现对消费者的监控。ConsumerEvent继承自EventObject。
针对对Consumer监控和管理由子类ConsumerStartedEvent和ConsumerStoppedEvent实现。
B.通过消费者监听实现对消费者的监听。
public interface ConsumerListener {
void onConsumerEvent(ConsumerEvent event);
}
C.通过ConsumerEventSource对消费者的监听。
3.在Advisory中实现对生产者的监控:
A.通过抽象类ProducerEvent实现对消费者的监控。ProducerEvent继承自EventObject。
针对对Producter监控和管理由子类ProducerStartedEvent和ProducerStoppedEvent实现。
B.通过生产者监听实现对消费者的监听。
public interface ProducerListener {
void onProducerEvent(ProducerEvent event);
}
C.通过ProducerEventSource对消费者的监听。
自定义事件:
package easyway.app.activemq.demo.events; import java.util.EventObject; /** * 通过EasywayEvent.java文件创建EasywayEvent类,这个类继承EventObject。这个类的构造函数的参数传递了产生这个事件的事件源(比如各种控件),方法getSource用来获得这个事件源的引用。 * @author Owner * */ public class EasywayEvent extends EventObject { /** * */ private static final long serialVersionUID = 1L; Object obj; public EasywayEvent(Object source) { super(source); obj = source; } public Object getSource() { return obj; } public void say() { System.out.println("This is say method..."); } }
监听器:
package easyway.app.activemq.demo.events; /** * 定义新的事件监听接口,该接口继承自EventListener;该接口包含对DemeEvent事件的处理程序: */ import java.util.EventListener; public interface EasywayListener extends EventListener { public void easywayEvent(EasywayEvent dm); }
事件监听实现类:
package easyway.app.activemq.demo.events; public class EasyWayListener1 implements EasywayListener { public void easywayEvent(EasywayEvent dm) { System.out.println("Inside listener1..."); } }
测试类:
package easyway.app.activemq.demo.events; import java.util.*; /** * 通过EasyWaySource..ava文件创造一个事件源类,它用一个java.utile.Vector对象来存储所有的事件监听 * 器对象,存储方式是通过addListener(..)这样的方法。notifyDemeEvent(..)是触发事件的方法, * 用来通知系统:事件发生了,你调用相应的处理函数(回调函数)吧。 * @author Owner * */ public class EasyWaySource { private Vector<EasywayListener> repository = new Vector<EasywayListener>(); EasywayListener dl; public EasyWaySource() { } public void addDemoListener(EasywayListener dl) { repository.addElement(dl); } public void notifyDemoEvent() { Enumeration enum1 = repository.elements(); while(enum1.hasMoreElements()) { dl = (EasywayListener)enum1.nextElement(); dl.easywayEvent(new EasywayEvent(this)); } } }