【问题标题】:Why MyBatisSystemException during .parallel(). execution in Alfresco 6.2?为什么在 .parallel() 期间出现 MyBatisSystemException。在 Alfresco 6.2 中执行?
【发布时间】:2021-03-07 18:09:00
【问题描述】:

在将 Alfresco 从 5.2 版升级到 6.2 版后,它变得不稳定:有时我们得到:

org.mybatis.spring.MyBatisSystemException: nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class java.util.ArrayList with invalid types () or values 

通常在 .parallel() 期间。集合执行。有完整的堆栈跟踪 https://pastebin.com/7d7NBwkn 并且有代码 https://pastebin.com/RyPt5d0g 。其实我连控制流都看不懂,为什么会涉及到MyBatis?

请帮帮我!

谢谢!

PS:实际上这个错误不能很好地重现。当我删除 .parallel() 时,此异常不会出现。并使用单线程流处理。

UPD:以下代码在 .parallel() 的情况下引发异常。执行并且在串行执行的情况下不会引发异常:

final SecurityManager sm = System.getSecurityManager();
   if (sm != null) {
        sm.checkPermission(new RuntimePermission("accessDeclaredMembers"));
    }

UPD 2 解决方案: 在 Alfresco 5.2 版 System.getSecurityManager() == NULL (!!!) 但在 6.2 版中。它已经设置好了。那是不同行为的问题(https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ForkJoinPool.html 中的详细信息)。 V 6.2 设置了 SecurityManager 和 v 5.2。没有。解决方案是将 Dockerfile 中的 catalina.sh 替换为新修改的 cataliha.sh,它删除了安全 JVM 选项。

【问题讨论】:

  • 请发布完整的堆栈跟踪。部分堆栈跟踪不是很有帮助。看到这个answer
  • java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessDeclaredMembers") - 您的问题是:您在 Java SecurityManager 中运行 Alfresco 进程,但没有正确/适当的策略文件。 Alfresco 本身不提供细粒度的策略文件,使用 AllPermission 授权(请参阅github.com/Alfresco/alfresco-community-repo/blob/master/…)。如果您在 webapp 之外部署自定义模块,您还需要授予 JAR 必要的权限。
  • 我们有权限 java.lang.RuntimePermission "accessDeclaredMembers";在 catalina.policy 中
  • 您是否还检查过是否已授予 Alfresco Web 应用程序及其所有构成代码/库的权限?如果仅授予某些 Tomcat 库,则无济于事。

标签: alfresco mybatis


【解决方案1】:

此异常来自 Java 安全管理器。如果您使用的是 Alfresco docker 镜像,则默认启用安全管理器。如果您已经完成了非 docker 安装,那么您将使用“-security”开关启动 tomcat。虽然建议使用安全管理器,因为它可以使您的安装更加安全,但它不是必需的。

如果你使用 Alfresco 的 docker 镜像,你需要修改 docker-compose.yml 文件并为“alfresco”服务指定一个“command”参数。开箱即用,“command”参数是[“catalina.sh”“run”“-security”]。您需要删除“-security”标志。例如:

...
services:
    alfresco:
        image: alfresco/alfresco-content-repository-community:6.2.0-ga
        command: ["catalina.sh" "run"]
...

如果您手动安装了 Alfresco,您只需更改启动它的方式。删除“-security”标志。

根据:

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ForkJoinPool.html

使用并行执行会导致在没有安全配置的情况下生成线程。这意味着对于这种情况,您不能使用并行执行,除非您禁用安全管理器。因此,您的选择是使用上述步骤禁用安全管理器或使用串行执行。

【讨论】:

  • 看来我的部署方案完全不同。请查看问题的最后更新
  • @EkaterinaIvanovaiceja.net 部署 Alfresco 有两种方法:1. Docker 镜像,或 2. 手动。我涵盖了这两个。 Alfresco 未启用安全管理器。它由 Tomcat 启用。如果你不使用 docker,你只需要检查你的启动 Tomcat 的方法。 “-security”命令行开关将启用安全管理器。还有其他命令行参数可以启用它。
猜你喜欢
  • 2020-04-29
  • 2013-06-08
  • 1970-01-01
  • 2018-12-17
  • 2019-03-25
  • 2013-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多