
org.rx.spring.MxController Maven / Gradle / Ivy
package org.rx.spring;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.rx.annotation.Subscribe;
import org.rx.core.StringBuilder;
import org.rx.core.*;
import org.rx.exception.ExceptionLevel;
import org.rx.exception.TraceHandler;
import org.rx.io.Bytes;
import org.rx.io.IOStream;
import org.rx.net.NetEventWait;
import org.rx.net.Sockets;
import org.rx.net.socks.SocksContext;
import org.rx.util.BeanMapper;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static org.rx.core.Extends.eq;
import static org.rx.core.Extends.ifNull;
import static org.rx.core.Sys.*;
@RequiredArgsConstructor
@RestController
@RequestMapping("mx")
public class MxController {
@RequestMapping("httpSignal")
public void httpSignal(String multicast, String group, Integer mcId) {
NetEventWait.multicastLocal(Sockets.parseEndpoint(multicast), group, ifNull(mcId, 0));
}
@RequestMapping("queryTraces")
public Map queryTraces(Boolean newest, String level,
Boolean methodOccurMost, String methodNamePrefix,
String metricsName,
Integer take,
HttpServletRequest request) {
if (!check(request)) {
return null;
}
Map result = new LinkedHashMap<>(3);
ExceptionLevel el = null;
if (!Strings.isBlank(level)) {
el = ExceptionLevel.valueOf(level);
}
result.put("errorTraces", TraceHandler.INSTANCE.queryTraces(newest, el, take));
result.put("methodTraces", Linq.from(TraceHandler.INSTANCE.queryTraces(methodOccurMost, methodNamePrefix, take))
.select(p -> {
Map t = Sys.toJsonObject(p);
t.remove("elapsedMicros");
t.put("elapsed", Sys.formatNanosElapsed(p.getElapsedMicros(), 1));
return t;
}));
result.put("metrics", TraceHandler.INSTANCE.queryMetrics(metricsName, take));
return result;
}
@RequestMapping("health")
public Object health(HttpServletRequest request, HttpServletResponse response) {
String x = request.getParameter("x");
if (!check(request) || x == null) {
return null;
}
try {
switch (Integer.parseInt(x)) {
case 1:
String type = request.getParameter("type");
String jsonVal = request.getParameter("jsonVal");
Object source = null, target;
if (!Strings.isBlank(type)) {
Class> clazz = Class.forName(type);
target = SpringContext.getBean(clazz);
if (target == null) {
return null;
}
if (jsonVal != null) {
source = fromJson(jsonVal, clazz);
}
} else {
if (jsonVal != null) {
source = fromJson(jsonVal, new TypeReference() {
}.getType());
}
target = RxConfig.INSTANCE;
}
return source != null ? BeanMapper.DEFAULT.map(source, target) : target;
case 2: {
String k = request.getParameter("k"),
v = request.getParameter("v");
Sys.diagnosticMx.setVMOption(k, v);
return "ok";
}
case 3:
boolean enable = Boolean.parseBoolean(request.getParameter("v"));
Sys.threadMx.setThreadContentionMonitoringEnabled(enable);
Sys.threadMx.setThreadCpuTimeEnabled(enable);
return "ok";
case 4:
String host = request.getParameter("host");
return Linq.from(InetAddress.getAllByName(host)).select(p -> p.getHostAddress()).toArray();
case 5:
response.setContentType("text/plain;charset=UTF-8");
return exec(request);
case 6:
return invoke(request);
case 7:
Class> ft = Class.forName(request.getParameter("ft"));
String fn = request.getParameter("fn");
String fu = request.getParameter("fu");
Map, Map> fms = Interceptors.ControllerInterceptor.fms;
if (fu == null) {
Map fts = fms.get(ft);
if (fts != null) {
fts.remove(fn);
}
} else {
fms.computeIfAbsent(ft, k -> new ConcurrentHashMap<>(8)).put(fn, fu);
}
return fms;
}
return svrState(request);
} catch (Throwable e) {
response.setContentType("text/plain;charset=UTF-8");
return String.format("%s\n%s", e, ExceptionUtils.getStackTrace(e));
}
}
// @PostMapping("directOffer")
// public void directOffer(String appName, String socksId, String endpoint, MultipartFile binary) {
// SendPack pack = new SendPack(appName, socksId, Sockets.parseEndpoint(endpoint));
// pack.setBinary(binary);
// server.frontendOffer(pack);
// }
//
// @SneakyThrows
// @PostMapping("directPoll")
// public void directPoll(String appName, String socksId, String endpoint, HttpServletResponse response) {
// ReceivePack pack = server.frontendPoll(new SendPack(appName, socksId, Sockets.parseEndpoint(endpoint)));
// ServletOutputStream out = response.getOutputStream();
// for (IOStream, ?> binary : pack.getBinaries()) {
// binary.read(out);
// }
// }
@SneakyThrows
Object invoke(HttpServletRequest request) {
Map params = getParams(request);
Class> kls = Class.forName((String) params.get("bean"));
Object bean = SpringContext.getBean(kls);
Method method = Reflects.getMethodMap(kls).get((String) params.get("method")).first();
List
© 2015 - 2025 Weber Informatics LLC | Privacy Policy