18.3 发送通知

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中的样子。

image-20211023132709075

图18.5 JConsole订阅了TacoCounter MBean,每创建100个taco就会收到通知

通知是应用程序主动向监视客户端发送数据和告警的好办法。这样做的话,就不需要客户端轮询托管属性或调用托管操作了。