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