18.3 发送通知
借助Spring的NotificationPublisher,MBeans可以推送通知到感兴趣的JMX客户端。NotificationPublisher有一个sendNotification()方法,当得到一个Notification对象时,它会发送通知给任意订阅该MBean的JMX客户端。
要让某个MBean发送通知,它必须要实现NotificationPublisherAware接口,该接口要求实现一个setNotificationPublisher()方法。例如,我们希望每创建100个taco就发送一个通知。我们可以修改TacoCounter类,让它实现NotificationPublisherAware,并使用注入的NotificationPublisher每创建100个taco时就发送通知。程序清单18.2展现了启用通知功能TacoCounter所需要的变更。
程序清单18.2 每创建100个taco就发送通知
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @Service @ManagedResource public class TacoCounter extends AbstractRepositoryEventListener<Taco> implements NotificationPublisherAware { private AtomicLong counter; private NotificationPublisher np; ... @Override public void setNotificationPublisher(NotificationPublisher np) { this.np = np; } ... @ManagedOperation public long increment(long delta) { long before = counter.get(); long after = counter.addAndGet(delta); if ((after / 100) > (before / 100)) { Notification notification = new Notification( "taco.count", this, before, after + "th taco created!"); np.sendNotification(notification); } return after; } }
|
在JMX客户端中,我们需要订阅TacoCounter MBean来接收通知。每创建100个taco,客户端就会收到通知。图18.5展现了通知在JConsole中的样子。
图18.5 JConsole订阅了TacoCounter MBean,每创建100个taco就会收到通知
通知是应用程序主动向监视客户端发送数据和告警的好办法。这样做的话,就不需要客户端轮询托管属性或调用托管操作了。