使用 ExecutorService 执行异步任务时出现问题

2024-03-13

我曾问过一个问题earlier https://stackoverflow.com/questions/8668839/java-velocity-engine-initialization-issue关于 ExecutorService 和 Apache Velocity 初始化。快速回顾一下——我有一个 Java EE 前端,它接受用户请求,然后对于每个请求,使用 ExecutorService(SingleThreadedExecutor 设置为守护进程)来启动冗长的工作流程。此工作流程包含在一个库中并且可以工作当通过 eclipse 以独立模式运行时,效果很好并且符合预期。当从网站(servlet)调用时,我观察到工作流程始终在初始化 Velocity 引擎(Velocity.init() 或 ve.init())时挂起。因此我提出了上述问题。

当所有答案/建议都不起作用时,我推断这与 Velocity 的启动方式有关,并决定转向 FreeMarker。现在我发现 FreeMarker 实现的工作流程也挂在完全相同的位置。这个“地方”是邮件构建部分,它根据传递的数据对象对评估模板并返回邮件字符串。调用 Freemark'ing 类和 FreeMark 类的类如下 -

   public class mailBuilder {

    private static final Logger log = Logger.getLogger( mailBuilder.class );    
    static String a;
    static String b;

    public mailBuilder(CustomDataStructure input)
    {
        a = input.getA();
        b = input.getB(); 
    }
    public static String returnMailstring() throws Exception
    {
        log.info("Gathering elements to construct email.");
        String mailText=null;
        Map context = new HashMap();
        context.put("a",a);
        context.put("b",b);
        log.info("Calling Freemarker");
        mailText=FreeMarkIT.ReturnReportString(context);
        log.info("Freeemarker returned string");

        return mailText;
    }
}

FreeMarkIT类如下——

    public class FreeMarkIT {
        private static final Logger log = Logger.getLogger( FreeMarkIT.class );
        private static Configuration config;
        private static Template template;

        public static String ReturnReportString(Map model) throws IOException, TemplateException
        {
            StringWriter sw = new StringWriter();
            try 
            {
               log.info("Going to get the template");
               config= new Configuration();
               log.info("Now really");
               template=config.getTemplate("src/resource/email_template.vm");
               log.info("Done initializing template");
               template.process(model, sw);
               sw.flush();
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }

            return sw.getBuffer().toString();
        }
    }

现在,从我的日志来看,工作线程似乎挂在线路上config=new Configuration()

同样,当从 eclipse 运行时,它在独立模式下按预期工作,但是当使用 ExecutorService 从 servlet 调用时会挂起。

我开始思考/意识到这可能与 Velocity 或 FreeMarker 无关,而与 ExecutorService 有关。 任何意见或建议都会有很大的帮助。

Thanks


您的代码不是线程安全的,因为您正在共享config and template跨所有线程实例(并不断重新设置它们)。使其线程安全的最简单方法是config and template方法中的局部变量而不是静态成员。正如 @JBNizet 在评论中指出的,你也有类似的问题mailBuilder with a and b。您可能想首先查看一些有关面向对象编程基础知识的教程,然后回到这个问题(提示,一般来说,您应该避免使用除常量之外的静态成员变量)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ExecutorService 执行异步任务时出现问题 的相关文章

随机推荐

  • 使用 Microsoft Graph 列出 Microsoft Sharepoint 站点

    我正在使用 Microsoft Graph 使用 Microsoft OneDrive 和 Microsoft Sharepoint 据我了解 从登录用户获取文件列表的 URLOneDrive is v1 0 me drive root c
  • 如何隐藏mapbox-gl中所有打开的标记弹出窗口?

    我找不到隐藏所有打开的标记弹出窗口或什至检查标记弹出状态的方法 我会想getPopup isOpen 可以让你检查状态 并且getPopup remove 在迭代某个数组中所有存储的标记时运行 将完成您在这里所需的操作
  • Minimax/ Alpha beta 剪枝移动顺序?

    我读过 例如 http radagast se othello Help order html http radagast se othello Help order html 首先搜索每个级别的最佳动作 可以使用迭代加深找到 使得搜索速度
  • 如何在heroku中运行“Rails Runner”?

    这就是我想做的 查找是否有人在推特上发布过有关所提供的特定课程的推文 如果有人确实发布了相关推文 我想将该推文保存到我的推文模型中 然后在相应的课程页面中显示该推文 这些脚本通过运行在本地运行rails runner get tweets
  • transitiveMemberOf $filter 仅当您是直接成员时才有效

    我正在尝试使用 Graph 来查明用户是否是某个组的传递成员 例如 Bob 是 Marketing 的成员 而 Marketing 是 Company 的成员 Bob 是 Company 的成员吗 If I do me transitive
  • 如何在 FastAPI 的 CORS 中间件中正确使用正则表达式?

    我有一个使用 FastAPI 后端和 Next js 前端的应用程序 在具有稳定来源的开发和生产中 我能够毫无问题地使用 CORSMiddleware 不过 我已经使用 Vercel 部署了 Next js 前端 并且希望利用 Vercel
  • 提取“/”前后的字符

    我试图提取 之前和之后的字符 但没有成功 句子是 XXXX YYY ZZZ AV HAHEHRS 3061 SDDW ASDA DDSF SAO JOSE DOS CAMPOS SP CEP 00000 000 输出应该是 SAO JOSE
  • PDFBox:处理非常大的 PDF。

    我正在处理一些非常大的 PDF 有些大小超过 7GB PDF 最多有 20 000 页和许多整页彩色图像 我想使用 PDFBox 来处理 PDF 但由于大小 当我尝试打开 PDF 时 出现 OutOfMemoryError 我正在使用版本
  • 如何用一个元素创建 3D 透视图像?

    I have a code that given an image does the effect of perspective in 3D This is the result 这是代码 thumb margin 100px perspe
  • 混合 http/https 站点

    到目前为止 我的 https 部署通常涉及使用 https 对整个站点进行简单锁定 并在 Web 服务器上提供 http 到 https 的重定向 我现在计划拥有一个 ASP NET MVC 站点 在云上 其中包含 http 和 https
  • Firebase 身份验证令牌过期时间

    我刚刚升级到新版本的 Firebase 但找不到在哪里可以设置 Firebase 身份验证令牌的过期时间 它曾经位于 Firebase 旧布局中的身份验证部分下 我将其设置了 1 年 Firebase 还有这个吗 如果您继续使用 Fireb
  • 0x7f 有什么特别之处?

    我正在阅读 avro 格式规范并试图了解其实现 下面是解码的方法长值 https avro apache org docs 1 8 2 spec html schema primitive Override public long read
  • 为什么局部函子不好?

    例如 如果谓词仅使用一次 那么在主函数中声明类加倍器有什么问题 include
  • 如何停止 docker pull

    我刚刚开始学习docker 在教程中 我看到了 docker pull 命令 可以像这样使用docker pull container name从 docker hub 存储库中提取相应的容器 But in case if you canc
  • HDFS 复制因子更改

    如果集群中的复制因子发生变化 例如从 5 更改为 3 并且集群重新启动 旧文件块会发生什么情况 它们是否会被视为过度复制并被删除 或者复制因子仅适用于新文件 这意味着旧文件块被复制 5 次 新文件块 重新启动后 被复制 3 次 如果集群不重
  • 为什么在定义具有 0 个输出的 MATLABContainers.Map 子类方法时出现“太多输出参数”?

    我试图通过子类化 MATLABContainers Map 类并添加具有 0 个输出的附加方法来扩展它 但在执行该方法时遇到 输出参数太多 错误 这并不是新方法实现所特有的 任何使用 0 输出扩展Containers Map 的其他方法都会
  • GraphQL 嵌套查询定义

    我正在尝试为我的查询创建树状结构 以摆脱像 peopleList peopleSingle peopleEdit peopleAdd peopleDelete companyList companySingle companyEdit co
  • Ruby 中有 nvl() 函数还是我必须自己编写它?

    我想使用 Oracle 的等效项nvl Ruby 中的函数 是否有内置函数或者我必须自己编写一个 Edit 我用它来将一些 sql 重写为 ruby INSERT INTO my table id val VALUES 1 nvl my v
  • git 和 CR 与 LF(但不是 CRLF)

    这听起来像是一个多余的问题 而且很可能是一个多余的问题 但我找不到答案 情况是这样的 我的应用程序正在创建以 CR 作为行结尾的文本文件 更具体地说 我没有明确地将行结尾设置为 CR 它恰好是我用来获取文本正文的命令的输出 当然 我可以手动
  • 使用 ExecutorService 执行异步任务时出现问题

    我曾问过一个问题earlier https stackoverflow com questions 8668839 java velocity engine initialization issue关于 ExecutorService 和