001
014
015 package com.liferay.portal.fabric.status;
016
017 import com.liferay.portal.fabric.status.JMXProxyUtil.ProcessCallableExecutor;
018 import com.liferay.portal.kernel.process.ProcessCallable;
019 import com.liferay.portal.kernel.util.ReflectionUtil;
020
021 import java.lang.management.BufferPoolMXBean;
022 import java.lang.management.ClassLoadingMXBean;
023 import java.lang.management.CompilationMXBean;
024 import java.lang.management.GarbageCollectorMXBean;
025 import java.lang.management.ManagementFactory;
026 import java.lang.management.MemoryMXBean;
027 import java.lang.management.MemoryManagerMXBean;
028 import java.lang.management.MemoryPoolMXBean;
029 import java.lang.management.OperatingSystemMXBean;
030 import java.lang.management.PlatformLoggingMXBean;
031 import java.lang.management.PlatformManagedObject;
032 import java.lang.management.RuntimeMXBean;
033 import java.lang.management.ThreadMXBean;
034
035 import java.util.ArrayList;
036 import java.util.List;
037 import java.util.concurrent.Future;
038
039 import javax.management.ObjectName;
040
041
044 public class RemoteFabricStatus implements FabricStatus {
045
046 public RemoteFabricStatus(ProcessCallableExecutor processCallableExecutor) {
047 this.processCallableExecutor = processCallableExecutor;
048 }
049
050 @Override
051 public AdvancedOperatingSystemMXBean getAdvancedOperatingSystemMXBean() {
052 OperatingSystemMXBean operatingSystemMXBean =
053 ManagementFactory.getOperatingSystemMXBean();
054
055 return JMXProxyUtil.newProxy(
056 operatingSystemMXBean.getObjectName(),
057 AdvancedOperatingSystemMXBean.class, processCallableExecutor);
058 }
059
060 @Override
061 public List<BufferPoolMXBean> getBufferPoolMXBeans() {
062 return getPlatformMXBeans(
063 BufferPoolMXBean.class, processCallableExecutor);
064 }
065
066 @Override
067 public ClassLoadingMXBean getClassLoadingMXBean() {
068 ClassLoadingMXBean classLoadingMXBean =
069 ManagementFactory.getClassLoadingMXBean();
070
071 return JMXProxyUtil.newProxy(
072 classLoadingMXBean.getObjectName(), ClassLoadingMXBean.class,
073 processCallableExecutor);
074 }
075
076 @Override
077 public CompilationMXBean getCompilationMXBean() {
078 CompilationMXBean compilationMXBean =
079 ManagementFactory.getCompilationMXBean();
080
081 return JMXProxyUtil.newProxy(
082 compilationMXBean.getObjectName(), CompilationMXBean.class,
083 processCallableExecutor);
084 }
085
086 @Override
087 public List<GarbageCollectorMXBean> getGarbageCollectorMXBeans() {
088 return getPlatformMXBeans(
089 GarbageCollectorMXBean.class, processCallableExecutor);
090 }
091
092 @Override
093 public List<MemoryManagerMXBean> getMemoryManagerMXBeans() {
094 return getPlatformMXBeans(
095 MemoryManagerMXBean.class, processCallableExecutor);
096 }
097
098 @Override
099 public MemoryMXBean getMemoryMXBean() {
100 MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
101
102 return JMXProxyUtil.newProxy(
103 memoryMXBean.getObjectName(), MemoryMXBean.class,
104 processCallableExecutor);
105 }
106
107 @Override
108 public List<MemoryPoolMXBean> getMemoryPoolMXBeans() {
109 return getPlatformMXBeans(
110 MemoryPoolMXBean.class, processCallableExecutor);
111 }
112
113 @Override
114 public PlatformLoggingMXBean getPlatformLoggingMXBean() {
115 PlatformLoggingMXBean platformLoggingMXBean =
116 ManagementFactory.getPlatformMXBean(PlatformLoggingMXBean.class);
117
118 return JMXProxyUtil.newProxy(
119 platformLoggingMXBean.getObjectName(), PlatformLoggingMXBean.class,
120 processCallableExecutor);
121 }
122
123 @Override
124 public RuntimeMXBean getRuntimeMXBean() {
125 RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
126
127 return JMXProxyUtil.newProxy(
128 runtimeMXBean.getObjectName(), RuntimeMXBean.class,
129 processCallableExecutor);
130 }
131
132 @Override
133 public ThreadMXBean getThreadMXBean() {
134 ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
135
136 return JMXProxyUtil.newProxy(
137 threadMXBean.getObjectName(), ThreadMXBean.class,
138 processCallableExecutor);
139 }
140
141 protected static <T extends PlatformManagedObject> List<T>
142 getPlatformMXBeans(
143 Class<T> mxBeanInterface,
144 ProcessCallableExecutor processCallableExecutor) {
145
146 List<T> list = new ArrayList<>();
147
148 try {
149 Future<ArrayList<ObjectName>> future =
150 processCallableExecutor.execute(
151 new GetPlatformMXBeanObjectNamesProcessCallable(
152 mxBeanInterface));
153
154 for (ObjectName objectName : future.get()) {
155 list.add(
156 JMXProxyUtil.newProxy(
157 objectName, mxBeanInterface, processCallableExecutor));
158 }
159 }
160 catch (Exception e) {
161 return ReflectionUtil.throwException(e);
162 }
163
164 return list;
165 }
166
167 protected final ProcessCallableExecutor processCallableExecutor;
168
169 protected static class GetPlatformMXBeanObjectNamesProcessCallable
170 implements ProcessCallable<ArrayList<ObjectName>> {
171
172 public GetPlatformMXBeanObjectNamesProcessCallable(
173 Class<? extends PlatformManagedObject> clazz) {
174
175 _clazz = clazz;
176 }
177
178 @Override
179 public ArrayList<ObjectName> call() {
180 ArrayList<ObjectName> objectNames = new ArrayList<>();
181
182 for (PlatformManagedObject platformManagedObject :
183 ManagementFactory.getPlatformMXBeans(_clazz)) {
184
185 objectNames.add(platformManagedObject.getObjectName());
186 }
187
188 return objectNames;
189 }
190
191 private static final long serialVersionUID = 1L;
192
193 private final Class<? extends PlatformManagedObject> _clazz;
194
195 }
196
197 }