是否无法在同一 TomEE 实例上的并行应用程序中使用 JasperReports(JasperReports 上下文)?
Is using JasperReports in parallel Applications on same TomEE Instance not possible (JasperReports Context)?
我们在刚下载的 TomEE 应用程序服务器中有一个奇怪的行为。
我们的情况:
我们有 运行ning 两个应用程序(我们称之为 v1 和 v2),它们通过 REST [=30] 为我们提供了一些 pdf 文件=] 使用 JasperReports。当我们发布 v1 时,一切正常。
当我们更新了一些内部代码并将其作为 v2 发布时,混乱开始了......(我们代码中的更改几乎不是我们问题的根源,这些只是计算更改。)
我们的混乱是,当我们首先访问 v1 中的代码时,v1 API 可以很好地提供我们的报告。当我们尝试从 v2 API 获取新报告时,我们 运行 进入 class 未找到异常。
Exception in thread "AsyncFileHandlerWriter-2081853534" java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.extensions.ExtensionsEnvironment
at net.sf.jasperreports.engine.DefaultJasperReportsContext.getExtensions(DefaultJasperReportsContext.java:277)
at net.sf.jasperreports.engine.util.MessageUtil.getMessageProvider(MessageUtil.java:70)
at net.sf.jasperreports.engine.JRRuntimeException.resolveMessage(JRRuntimeException.java:166)
at net.sf.jasperreports.engine.JRRuntimeException.getMessage(JRRuntimeException.java:147)
at net.sf.jasperreports.engine.JRRuntimeException.getMessage(JRRuntimeException.java:138)
at java.base/java.lang.Throwable.getLocalizedMessage(Throwable.java:396)
at java.base/java.lang.Throwable.toString(Throwable.java:485)
at java.base/java.lang.String.valueOf(String.java:2801)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:135)
at java.base/java.lang.Throwable.printEnclosedStackTrace(Throwable.java:699)
at java.base/java.lang.Throwable.printEnclosedStackTrace(Throwable.java:713)
at java.base/java.lang.Throwable.printStackTrace(Throwable.java:671)
at java.base/java.lang.Throwable.printStackTrace(Throwable.java:725)
at org.apache.juli.OneLineFormatter.format(OneLineFormatter.java:150)
at org.apache.juli.FileHandler.publish(FileHandler.java:294)
at org.apache.juli.AsyncFileHandler.publishInternal(AsyncFileHandler.java:146)
at org.apache.juli.AsyncFileHandler$LogEntry.flush(AsyncFileHandler.java:185)
at org.apache.juli.AsyncFileHandler$LoggerThread.run(AsyncFileHandler.java:161)
到目前为止,我们考虑过缺少依赖项或缺少库,但是:
当我们首先访问 v2 API 时,我们在 v1 API 中遇到相同的错误。
所以似乎首先被调用的 API-应用程序 "binds" JasperStuff 和其他 API 无法访问它。
我们的知识实际上已经结束了,我们希望我们能在这里得到一些帮助。
一点背景信息:我们使用一个核心包,它提供一些核心功能,如 DB-Access 和 JDNI 资源、CORS 过滤器和安全接口。我不认为核心包(在每个 war 中单独提供)会造成一些混乱,但由于我们除其他外还有 2 个具有相同名称的 JDNI 资源(但在不同的应用程序中,因此在不同的上下文)我想我需要在这里留下这个信息。
提前感谢您的帮助。
因此,在经过一番努力并尝试了不同的方法来解决问题之后,我们终于找到了一个可行的解决方案:我们将我们的 JasperReports(和必要的依赖)库包含到 tomcats common.loader
属性。
结果是,我们没有并发的 JasperReports 库(尽管它们是相同的版本)。这应该是原因让我有点困惑,但它给我们带来了预期的结果。
这样做的提示是 AsyncFileHandlerWriter
和 "feeling",第一个使用的上下文可以与 JasperReports 库一起正常工作。感觉有点像上下文并发,但老实说,我们不确定这是正确的解决方案还是底层问题的解决方法。
如果有人有进一步的提示,我们感谢每一个提示!提前致谢。
我们在刚下载的 TomEE 应用程序服务器中有一个奇怪的行为。 我们的情况: 我们有 运行ning 两个应用程序(我们称之为 v1 和 v2),它们通过 REST [=30] 为我们提供了一些 pdf 文件=] 使用 JasperReports。当我们发布 v1 时,一切正常。
当我们更新了一些内部代码并将其作为 v2 发布时,混乱开始了......(我们代码中的更改几乎不是我们问题的根源,这些只是计算更改。)
我们的混乱是,当我们首先访问 v1 中的代码时,v1 API 可以很好地提供我们的报告。当我们尝试从 v2 API 获取新报告时,我们 运行 进入 class 未找到异常。
Exception in thread "AsyncFileHandlerWriter-2081853534" java.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.extensions.ExtensionsEnvironment
at net.sf.jasperreports.engine.DefaultJasperReportsContext.getExtensions(DefaultJasperReportsContext.java:277)
at net.sf.jasperreports.engine.util.MessageUtil.getMessageProvider(MessageUtil.java:70)
at net.sf.jasperreports.engine.JRRuntimeException.resolveMessage(JRRuntimeException.java:166)
at net.sf.jasperreports.engine.JRRuntimeException.getMessage(JRRuntimeException.java:147)
at net.sf.jasperreports.engine.JRRuntimeException.getMessage(JRRuntimeException.java:138)
at java.base/java.lang.Throwable.getLocalizedMessage(Throwable.java:396)
at java.base/java.lang.Throwable.toString(Throwable.java:485)
at java.base/java.lang.String.valueOf(String.java:2801)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:135)
at java.base/java.lang.Throwable.printEnclosedStackTrace(Throwable.java:699)
at java.base/java.lang.Throwable.printEnclosedStackTrace(Throwable.java:713)
at java.base/java.lang.Throwable.printStackTrace(Throwable.java:671)
at java.base/java.lang.Throwable.printStackTrace(Throwable.java:725)
at org.apache.juli.OneLineFormatter.format(OneLineFormatter.java:150)
at org.apache.juli.FileHandler.publish(FileHandler.java:294)
at org.apache.juli.AsyncFileHandler.publishInternal(AsyncFileHandler.java:146)
at org.apache.juli.AsyncFileHandler$LogEntry.flush(AsyncFileHandler.java:185)
at org.apache.juli.AsyncFileHandler$LoggerThread.run(AsyncFileHandler.java:161)
到目前为止,我们考虑过缺少依赖项或缺少库,但是: 当我们首先访问 v2 API 时,我们在 v1 API 中遇到相同的错误。
所以似乎首先被调用的 API-应用程序 "binds" JasperStuff 和其他 API 无法访问它。 我们的知识实际上已经结束了,我们希望我们能在这里得到一些帮助。
一点背景信息:我们使用一个核心包,它提供一些核心功能,如 DB-Access 和 JDNI 资源、CORS 过滤器和安全接口。我不认为核心包(在每个 war 中单独提供)会造成一些混乱,但由于我们除其他外还有 2 个具有相同名称的 JDNI 资源(但在不同的应用程序中,因此在不同的上下文)我想我需要在这里留下这个信息。
提前感谢您的帮助。
因此,在经过一番努力并尝试了不同的方法来解决问题之后,我们终于找到了一个可行的解决方案:我们将我们的 JasperReports(和必要的依赖)库包含到 tomcats common.loader
属性。
结果是,我们没有并发的 JasperReports 库(尽管它们是相同的版本)。这应该是原因让我有点困惑,但它给我们带来了预期的结果。
这样做的提示是 AsyncFileHandlerWriter
和 "feeling",第一个使用的上下文可以与 JasperReports 库一起正常工作。感觉有点像上下文并发,但老实说,我们不确定这是正确的解决方案还是底层问题的解决方法。
如果有人有进一步的提示,我们感谢每一个提示!提前致谢。