当前位置: 首页 > 知识库问答 >
问题:

在具有单个HTTP请求的servlet线程上运行长时间运行的进程总是不好吗?[副本]

暨弘懿
2023-03-14

我有一个Java应用程序(运行在WAS8.5),它充当客户机的一种服务器目录。应用程序有一个触发长时间运行的进程的servlet。

这个过程:从第三方数据库获取数据,执行Java逻辑,将记录写回应用程序自己的数据库(这些数据库连接是池连接)。

public class SyncMissingServlet extends HttpServlet implements Servlet{

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException
        {               
            try{
                SyncMissing.runSync();
            }catch(Exception ex){
                logger.error(new LogMessage("ERROR: "), ex);
                this.sendReply(printWriter, "ERROR: " + ex.toString());
            }       
        }
}

public class SyncMissing
{
    public static void runSync() throws Exception 
    {
        Timer t = new Timer(true);

        SyncMissingTask task = new SyncMissingTask(); //SyncMissingTask is an instance of TimerTask
        // Start the synchronization 5 secs from now, and run it every 30 days.
        t.schedule(task, 5000, 2592000000l); //this 30 day timings never really worked out for the client, 
                                             //since the app server is restarted frequently for deployments.

    }
}

我明白选项3和4确实是推荐的选项(或者可能是选项5)。但我有一种感觉,在我的业务场景中--选项3和4可能是矫枉过正。

如果真的需要每月只有一个用户手动调用servlet,那么选项1和2有那么糟糕吗?(我的客户想要最快的解决方案,当然不会资助选项5)

共有1个答案

葛宏爽
2023-03-14

如果servlet一个月只运行一次,并且只有一个客户机触发它,那么可以在servlet的线程本身中运行它,或者在servlet内部创建一个新线程,让它来完成任务。当您有许多客户机同时发出请求时,就会出现加载和响应时间的问题,这时您可能希望使用Executor服务或异步servlet。

 类似资料:
  • 我有一个在Tomcat7上运行的Spring3.0WebMVC应用程序。在应用程序启动时,我启动一个后台线程来加载内存缓存,其中包含来自数据库的记录。该线程从数据库加载所有数据通常需要一个多小时。在同一个应用程序中,我有一个@Controller注释类,它公开了一个REST接口,客户端可以通过该接口从加载的缓存中获取对象。 我们的要求之一是,在数据加载完成之前发出的任何REST请求都将立即向客户端

  • 我们有一个应用程序接口实现在裸骨Scala Akka HTTP中--一对路由前面的大量计算(CPU和内存密集)。没有集群-所有运行在一个强壮的机器上。计算量相当大--一个独立请求可能需要60多秒才能完成。我们并不那么在意速度。没有阻塞IO,只是大量的CPU处理。 当我开始对它进行性能测试时,出现了一个有趣的模式:假设请求A1、A2、...、A10通过。它们会大量使用资源,结果Akka会为溢出的请求

  • 问题内容: 在我们的Web应用程序中,用户可以进行需要大量数据库表进行更新的更改。所有内容的加载时间最长为30秒。我不希望用户在导航到另一个页面之前等待其完成。 我将长时间运行的代码放在自己的页面上(例如,“ updateinfo.aspx”),并尝试了一些解决方案,包括jQuery AJAX调用“ updateinfo.aspx”或加载调用“ updateinfo.aspx”的图像文件。在所有情

  • 问题内容: 我有一个用Go语言编写的运行时间较长的服务器。Main会触发执行程序逻辑的多个goroutine。在那之后主要没有什么用。一旦主程序退出,程序将退出。我现在使用的使程序运行的方法只是对fmt.Scanln()的简单调用。我想知道其他人如何阻止main退出。以下是一个基本示例。在这里可以使用哪些想法或最佳做法? 我考虑过创建一个通道并通过接收该通道来延迟main的退出,但是我认为如果我的

  • 经过长时间的调查,问题似乎是长时间运行的请求超时,并且在NodeJS中再次调用endpoint。没有来自浏览器的新网络请求。我做了一些测试,2分钟后再次调用endpoint。我读到NodeJS中http请求的默认超时时间为2分钟。 https://nodejs.org/docs/latest-v12.x/api/http.html#http_server_timeout 我使用的是NestJS(有

  • 我试图实现每个组的并行性,其中分组元素并行运行,组内每个元素按顺序工作。然而,对于下面的代码,第一个emit使用并行线程,但对于后续emit,它使用一些不同的线程池。如何实现组的并行性和组内元素的顺序执行。 日志