gpt4 book ai didi

java - 当 Web 应用程序没有太多请求时如何启动计划线程?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:00 26 4
gpt4 key购买 nike

我有一个 Java Web 应用程序,预计会有很多用户对其产生很大的负载。同时,有一些需要大量处理的计划任务,我正在寻找一些自动化的方法来启动这个线程并根据 web 请求的高负载暂停它。是否有任何现成的解决方案可用于此任务?

最佳答案

  • 使用带有静态计数器的 javax.servlet.Filter,由过滤器递增和递减。这样你就知道当前的负载(=当前正在处理的请求数)
  • @Startup@Singleton@Schedule 一起使用来执行常规任务(或任何其他调度程序,如Quartz),例如每5 分钟
  • 在该任务中检查负载。如果它很低,就足以开始真正的任务。
  • 您还可以监控正在运行 任务的当前负载,例如暂停或退出。

例如,如果真正的任务是处理队列的内容,这是可行的。

否则,如果第一个任务的频率高于实际任务的频率,或者您必须确保每天只运行一次实际任务(或至少每天一次)。

示例代码:

过滤器:

@WebFilter("/*")
public class LoadFilter implements Filter {
private final static Logger log = Logger.getLogger(LoadFilter.class
.getName());

private final static AtomicInteger load = new AtomicInteger();

public static int getLoad() {
return load.get();
}

public void init(final FilterConfig fc) throws ServletException {
log.info("Hello from init()");
}

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

final int currentLoad = load.incrementAndGet();
try {
log.info("Current load (enter): " + currentLoad);
chain.doFilter(req, resp);
} finally {
final int newLoad = load.decrementAndGet();
log.info("Current load (exit): " + newLoad);
}
}

public void destroy() {
log.info("Bye from destroy()");
}
}

和 EJB

@Singleton
@Startup
public class StartupSingleton {
@Schedule(second = "*/10", minute = "*", hour = "*", persistent = false)
public void execute() {
// Check load; if low, run task(s)
if (LoadFilter.getLoad() < 10) {
// Run tasks
}
}
}

关于java - 当 Web 应用程序没有太多请求时如何启动计划线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18608799/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com