17.2 Tạo MBean của riêng bạn
Spring giúp bạn dễ dàng expose bất kỳ bean nào dưới dạng JMX MBean. Tất cả những gì bạn cần làm là đánh dấu lớp bean với @ManagedResource, sau đó đánh dấu các phương thức hoặc thuộc tính bằng @ManagedOperation hoặc @ManagedAttribute. Spring sẽ lo phần còn lại.
Ví dụ, giả sử bạn muốn cung cấp một MBean để theo dõi số lượng taco đã được đặt qua Taco Cloud. Bạn có thể định nghĩa một bean dịch vụ để đếm số lượng taco đã được tạo ra. Đoạn mô tả sau cho thấy một service như vậy có thể trông như thế nào.
Hình 17.1 Các endpoint của Actuator được tự động expose dưới dạng JMX MBean
package tacos.jmx;
import java.util.concurrent.atomic.AtomicLong;
import org.springframework.data.rest.core.event.AbstractRepositoryEventListener;
import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Service;
import tacos.Taco;
import tacos.data.TacoRepository;
@Service
@ManagedResource
public class TacoCounter
extends AbstractRepositoryEventListener<Taco> {
private AtomicLong counter;
public TacoCounter(TacoRepository tacoRepo) {
tacoRepo
.count()
.subscribe(initialCount -> {
this.counter = new AtomicLong(initialCount);
});
}
@Override
protected void onAfterCreate(Taco entity) {
counter.incrementAndGet();
}
@ManagedAttribute
public long getTacoCount() {
return counter.get();
}
@ManagedOperation
public long increment(long delta) {
return counter.addAndGet(delta);
}
}Lớp TacoCounter được đánh dấu với @Service để nó có thể được phát hiện bởi cơ chế quét component và một thể hiện của nó sẽ được đăng ký như một bean trong application context của Spring. Nhưng lớp này cũng được chú thích với @ManagedResource để chỉ định rằng bean này cũng sẽ là một MBean. Là một MBean, nó sẽ expose một thuộc tính (attribute) và một thao tác (operation). Phương thức getTacoCount() được đánh dấu với @ManagedAttribute để nó được expose dưới dạng thuộc tính MBean, trong khi phương thức increment() được đánh dấu với @ManagedOperation, để nó được expose như một thao tác MBean. Hình 17.4 minh họa cách MBean TacoCounter hiển thị trong JConsole.
Hình 17.4 Các thao tác và thuộc tính của TacoCounter được hiển thị trong JConsole
Làm việc với các thao tác và thuộc tính của MBean chủ yếu là thao tác theo hướng pull. Nghĩa là, ngay cả khi giá trị của một thuộc tính MBean thay đổi, bạn sẽ không biết điều đó trừ khi bạn xem thuộc tính đó thông qua một client JMX. Giờ hãy đảo ngược tình thế và xem cách bạn có thể push thông báo từ một MBean đến client JMX.
