package com.bagri.server.hazelcast.task.node; import static com.bagri.client.hazelcast.serialize.DataSerializationFactoryImpl.factoryId; import static com.bagri.server.hazelcast.serialize.DataSerializationFactoryImpl.cli_GetNodeInfoTask; import java.io.IOException; import java.lang.management.ManagementFactory; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.Callable; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.openmbean.CompositeData; import com.bagri.support.util.DateUtils; import com.bagri.support.util.JMXUtils; import com.hazelcast.core.Client; import com.hazelcast.core.Hazelcast; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.nio.ObjectDataInput; import com.hazelcast.nio.ObjectDataOutput; import com.hazelcast.nio.serialization.IdentifiedDataSerializable; public class NodeInfoProvider implements Callable<CompositeData>, IdentifiedDataSerializable { public enum InfoType { memory, timing, client } private InfoType type; public NodeInfoProvider() { } public NodeInfoProvider(InfoType type) { this.type = type; } @Override public int getFactoryId() { return factoryId; } @Override public int getId() { return cli_GetNodeInfoTask; } @Override public CompositeData call() throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); if (type == InfoType.memory) { ObjectName memName = new ObjectName("java.lang:type=Memory"); return (CompositeData) mbs.getAttribute(memName, "HeapMemoryUsage"); } else if (type == InfoType.timing) { ObjectName osName = new ObjectName("java.lang:type=Runtime"); Map<String, Object> times = new HashMap<String, Object>(2); long time = (Long) mbs.getAttribute(osName, "StartTime"); times.put("StartTime", new Date(time).toString()); time = (Long) mbs.getAttribute(osName, "Uptime"); times.put("Uptime", DateUtils.getDuration(time)); return JMXUtils.mapToComposite("Timings", "Timing info", times); } else { Set<HazelcastInstance> instances = Hazelcast.getAllHazelcastInstances(); Map<String, Object> clients = new HashMap<String, Object>(); for (HazelcastInstance hzInstance: instances) { for (Client client: hzInstance.getClientService().getConnectedClients()) { clients.put(client.getUuid(), client.getSocketAddress().toString()); } } return JMXUtils.mapToComposite("Clients", "Clients info", clients); } } @Override public void readData(ObjectDataInput in) throws IOException { type = InfoType.valueOf(in.readUTF()); } @Override public void writeData(ObjectDataOutput out) throws IOException { out.writeUTF(type.name()); } }