Annotate your class with the @MBean annotation.
@MBean("GettingStarted:name=Person") public class Person { ... }
Create an instance of your class and register it.
public static void main(String[] args) { Person person = new Person(); MBeans.registerMBeanFor(person); }
The program above will register and export the given person object as an MBean:
To export fields of a class as MBean attribute simple annotate it as @MAttribute
@MBean("GettingStarted:name=Person") public class Person { @MAttribute private String firstName = "Reto"; }
The field is then available as read only attribute in the MBean:
To make a MBean writable set the MAttribute parameter isWritable to true:
@MBean("GettingStarted:name=Person") public class Person { @MAttribute(isWritable=true) private String firstName = "Reto"; }
Now the MBean attribute can be changed. Changing the attribute in the MBean will also change the value of the field in the person object:
To export a method of a class as a MBean operation simple annotate it with @MOperation
@MBean("GettingStarted:name=Person") public class Person { private String firstName = "Reto"; @MOperation private void print() { System.out.println(firstName); } }
The operation of the MBean can now be executed and the annotated method will be called:
To export more than one object of the same class as MBean the object’s name must be unique. Use EL like expressions to give each object a unique name:
@MBean("GettingStarted:type=Person,name=#{firstName}") public class Person { private String firstName; public Person(String firstName) { this.firstName = firstName; }
Create two different Person objects with different first names and register them as MBeans:
public static void main(String[] args) { Person reto = new Person("Reto"); MBeans.registerMBeanFor(reto); Person flavio = new Person("Flavio"); MBeans.registerMBeanFor(flavio); }
There are now two MBean with different names registered:
The following enhanced example uses some advanced annotations:
@MBean(value = "GettingStarted:type=Person,name=#{firstName}", description = "This is #{firstName} #{name} living in #{home.city}") public class Person { private String firstName; @MAttribute(name = "lastName", description = "Last name of the person", isWritable = true) private String name; // The @MInclude annotation can be used to add attributes and operations that are declared on an other class to the current MBean. @MInclude private Age age; // The @MCompositionReference can be used to reference another MBean that is also registered/unregistered if the current MBean is registered/unregistered. @MCompositionReference(concatName = true) private Address home; @MAttribute // The @MSizeAttribute can be used to add an attribute that contains the size of a List or Map or the length of a String. @MSizeAttribute(name = "numberOfChildren") private List<Child>; children; public Person(String firstName, String name, Age age, Address home, List<Child> children) { this.firstName = firstName; this.name = name; this.age = age; this.home = home; this.children = children; } @MAttribute(description = "First name of the person", isWritable = true) public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } @MOperation(description = "Prints the firstName and lastName to system out", impact = Impact.INFO) public void print() { System.out.print(firstName); System.out.print(" "); System.out.println(name); } public static void main(String[] args) { PersonRegistry registry = new PersonRegistry(); Person reto = new Person("Reto", "Weiss", new Age(LocalDate.of(1972, 6, 10)), new Address("Home", "Baarerstrasse 12", 6300, "Zug", "Switzerland"), Arrays.asList(new Child("Anna", 2001), new Child("Toni", 2003), new Child("Gisela", 2007))); registry.addPerson(reto); Person flavio = new Person("Flavio", "Sadeghi", new Age(LocalDate.of(1986, 7, 23)), new Address("Business", "Baarerstrasse 12", 6300, "Zug", "Switzerland"), Arrays.asList(new Child("Mirco", 2013))); registry.addPerson(flavio); } }
public class Age { private LocalDate birthday; public Age(LocalDate birthday) { this.birthday = birthday; } @MAttribute(description = "Age in years of the person") public int getAge() { return birthday.until(LocalDate.now()).getYears(); } }
@MBean(value = "address=#{type}", description = "A postal address") public class Address { @MAttribute private String type; @MAttribute private String street; @MAttribute private int zip; @MAttribute private String city; @MAttribute private String country; public Address(String type, String street, int zip, String city, String country) { this.type = type; this.street = street; this.zip = zip; this.city = city; this.country = country; } }
The MCollections class provides methods to convert collections to managed collections. A managed collection automatically registers MBeans that are added to the collection and unregisters them if they are removed.
public class PersonRegistry { // Every person put to these collection will be registered as MBean! private Map<String, Person> persons = MCollections.managedMap(new HashMap<>()); public void addPerson(Person person) { persons.put(person.getFirstName(), person); } }
// The annotation @MComposite declares a complex attribute type @MComposite public class Child { // The @MItem annotation is used to add properties to the complex type. @MItem(description = "Name of the child") private String name; @MItem(description = "Year of birth of the child") private int yearOfBirth; public Child(String name, int yearOfBirth) { this.name = name; this.yearOfBirth = yearOfBirth; } }
The example will create the following MBeans: