使用 parallelStream 的 SpringTemplateEngine 进程

SpringTemplateEngine process with parallelStream

提问人:Matej Hudak 提问时间:11/16/2023 更新时间:11/16/2023 访问量:19

问:

我正在尝试在 java 中使用并行流处理多个 thymeleaf 模板。 我正在使用 springboot 2.7.17 和 thymeleaf-spring5 3.0.15 和 java 17。

问题是我会得到多个: SpelEvaluationException:EL1011E:方法调用:尝试在空上下文对象上调用方法“xy”,其中 xy 是任何函数,例如 #lists.isEmpty、#strings.equals 等。

以下是 SpringTemplateEngine 配置:

SpringTemplateEngine templateEngine = new SpringTemplateEngine();

        templateEngine.addTemplateResolver(defaultTemplateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        HashSet<IDialect> additionalDialects = new HashSet<>(Arrays.asList(
                new LayoutDialect(),
                new CgDialect(),
                new StripWhitespaceDialect(),
                new GaDialect()));
        templateEngine.setAdditionalDialects(additionalDialects);
        templateEngine.setMessageResolver(new SpringMessageResolver());
        templateEngine.setMessageSource(messageSource);

以下是我如何配置我的 WebContext:

WebContext ctx = new WebContext(pageModel.getRequest(), pageModel.getResponse(), context, pageModel.getLocale());
ctx.setVariables(pageModel.getModel());
ctx.setVariable(ThymeleafEvaluationContext.THYMELEAF_EVALUATION_CONTEXT_CONTEXT_VARIABLE_NAME, new ThymeleafEvaluationContext(applicationContext, new DefaultFormattingConversionService()));

RequestContext requestContext = new RequestContext(pageModel.getRequest(), pageModel.getResponse(), context, pageModel.getModel());
ctx.setVariable(SpringContextVariableNames.SPRING_REQUEST_CONTEXT, requestContext);

SpringWebMvcThymeleafRequestContext thymeleafRequestContext = new SpringWebMvcThymeleafRequestContext(requestContext, pageModel.getRequest());
ctx.setVariable(SpringContextVariableNames.THYMELEAF_REQUEST_CONTEXT, thymeleafRequestContext);

这就是执行:

templateList.parallelStream().forEach(templateName -> {
            System.out.println(templateEngine.process(templateName, ctx));
        });

WebContext 具有它需要的所有变量,如果我在没有 parallelStream 的情况下按顺序运行它,则此代码有效。

我希望并行流能够更快地呈现多个结果。

我不明白的是: 如果我为流程方法的每次执行传递相同的上下文,为什么模板没有上下文? Spring 模板引擎是否打算在多个线程上使用?

感谢您的任何建议和帮助。

spring-boot 多线程 spring-thymeleaf

评论


答: 暂无答案