25 changed files with 328 additions and 64 deletions
@ -0,0 +1,60 @@ |
|||||
|
//package org.nl.wms.util;
|
||||
|
//
|
||||
|
//import org.apache.catalina.connector.Connector;
|
||||
|
//import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
|
||||
|
//import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
|
||||
|
//import org.springframework.context.ApplicationListener;
|
||||
|
//import org.springframework.context.annotation.Bean;
|
||||
|
//import org.springframework.context.annotation.Configuration;
|
||||
|
//import org.springframework.context.event.ContextClosedEvent;
|
||||
|
//
|
||||
|
//import java.util.concurrent.Executor;
|
||||
|
//import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
//import java.util.concurrent.TimeUnit;
|
||||
|
//
|
||||
|
///**
|
||||
|
// * @Author: lyd
|
||||
|
// * @Description: 优雅停机
|
||||
|
// * @Date: 2023/12/21
|
||||
|
// */
|
||||
|
//@Configuration
|
||||
|
//public class GracefulShutdownConfig {
|
||||
|
// @Bean
|
||||
|
// public GracefulShutdown gracefulShutdown() {
|
||||
|
// return new GracefulShutdown();
|
||||
|
// }
|
||||
|
//
|
||||
|
// @Bean
|
||||
|
// public TomcatServletWebServerFactory webServerFactory(final GracefulShutdown gracefulShutdown) {
|
||||
|
// TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
|
||||
|
// factory.addConnectorCustomizers(gracefulShutdown);
|
||||
|
// return factory;
|
||||
|
// }
|
||||
|
//
|
||||
|
// private static class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
|
||||
|
// private volatile Connector connector;
|
||||
|
//
|
||||
|
// @Override
|
||||
|
// public void customize(Connector connector) {
|
||||
|
// this.connector = connector;
|
||||
|
// }
|
||||
|
//
|
||||
|
// @Override
|
||||
|
// public void onApplicationEvent(ContextClosedEvent event) {
|
||||
|
// this.connector.pause();
|
||||
|
// Executor executor = this.connector.getProtocolHandler().getExecutor();
|
||||
|
// if (executor instanceof ThreadPoolExecutor) {
|
||||
|
// ThreadPoolExecutor threadPoolExecutor = null;
|
||||
|
// try {
|
||||
|
// threadPoolExecutor = (ThreadPoolExecutor) executor;
|
||||
|
// threadPoolExecutor.shutdown();
|
||||
|
// if (!threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS)) {
|
||||
|
// threadPoolExecutor.shutdownNow();
|
||||
|
// }
|
||||
|
// } catch (InterruptedException ex) {
|
||||
|
// threadPoolExecutor.shutdownNow();
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
// }
|
||||
|
//}
|
@ -0,0 +1,54 @@ |
|||||
|
package org.nl.wms.util; |
||||
|
|
||||
|
import ch.qos.logback.classic.AsyncAppender; |
||||
|
import ch.qos.logback.classic.Logger; |
||||
|
import ch.qos.logback.classic.LoggerContext; |
||||
|
import ch.qos.logback.core.Appender; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: |
||||
|
* @Date: 2023/12/22 |
||||
|
*/ |
||||
|
public class LogbackQueueMonitor { |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
// 获取 LoggerContext
|
||||
|
LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); |
||||
|
|
||||
|
// 获取 AsyncAppender
|
||||
|
AsyncAppender asyncAppender = getAsyncAppender(loggerContext); |
||||
|
|
||||
|
// 监控队列大小
|
||||
|
monitorQueueSize(asyncAppender); |
||||
|
} |
||||
|
|
||||
|
private static AsyncAppender getAsyncAppender(LoggerContext loggerContext) { |
||||
|
Logger rootLogger = loggerContext.getLogger(Logger.ROOT_LOGGER_NAME); |
||||
|
// 替换为你实际的 Appender 名称
|
||||
|
Appender appender = rootLogger.getAppender("asyncFileAppender"); |
||||
|
if (appender instanceof AsyncAppender) { |
||||
|
return (AsyncAppender) appender; |
||||
|
} else { |
||||
|
throw new IllegalStateException("AsyncAppender not found"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private static void monitorQueueSize(AsyncAppender asyncAppender) { |
||||
|
new Thread(() -> { |
||||
|
while (true) { |
||||
|
try { |
||||
|
// 每隔5秒监控一次
|
||||
|
Thread.sleep(5000); |
||||
|
} catch (InterruptedException e) { |
||||
|
e.printStackTrace(); |
||||
|
} |
||||
|
|
||||
|
int queueSize = asyncAppender.getQueueSize(); |
||||
|
System.out.println("AsyncAppender Queue Size: " + queueSize); |
||||
|
} |
||||
|
}).start(); |
||||
|
} |
||||
|
} |
||||
|
|
@ -0,0 +1,75 @@ |
|||||
|
<template> |
||||
|
<el-dialog |
||||
|
title="任务编辑" |
||||
|
append-to-body |
||||
|
:visible.sync="dialogVisible" |
||||
|
destroy-on-close |
||||
|
width="750px" |
||||
|
@close="close" |
||||
|
@open="open" |
||||
|
> |
||||
|
<el-form label-width="180px"> |
||||
|
<el-form-item v-for="(value, key) in jsonData" :label="key" :key="key"> |
||||
|
<el-input v-model="jsonData[key]"></el-input> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button type="primary" @click="saveData">保存</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-dialog> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import '@riophae/vue-treeselect/dist/vue-treeselect.css' |
||||
|
|
||||
|
export default { |
||||
|
name: 'EditTaskDialog', |
||||
|
props: { |
||||
|
dialogShow: { |
||||
|
type: Boolean, |
||||
|
default: false |
||||
|
}, |
||||
|
rowData: { |
||||
|
type: Object, |
||||
|
default: null |
||||
|
} |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
dialogVisible: false, |
||||
|
tableRadio: null, |
||||
|
jsonData: {}, |
||||
|
tableData: [] |
||||
|
} |
||||
|
}, |
||||
|
watch: { |
||||
|
dialogShow: { |
||||
|
handler(newValue) { |
||||
|
this.dialogVisible = newValue |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
methods: { |
||||
|
saveData() { |
||||
|
|
||||
|
}, |
||||
|
clickChange(item) { |
||||
|
this.tableRadio = item |
||||
|
}, |
||||
|
open() { |
||||
|
console.log(this.rowData) |
||||
|
this.jsonData = JSON.parse(this.rowData.request_param) |
||||
|
}, |
||||
|
close() { |
||||
|
this.crud.resetQuery(false) |
||||
|
this.$emit('update:dialogShow', false) |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
<style rel="stylesheet/scss" lang="scss" scoped> |
||||
|
::v-deep .el-dialog__body { |
||||
|
padding-top: 0px; |
||||
|
} |
||||
|
</style> |
||||
|
|
Loading…
Reference in new issue