【问题标题】:Parallel Tests with Jetty and Weld使用 Jetty 和 Weld 进行并行测试
【发布时间】:2013-06-20 09:59:37
【问题描述】:

我想在同一个 JVM 中使用 CDI/Weld 在嵌入式 Jetty 上并行执行单元测试。

对于每个测试方法,都会创建一个带有干净数据库的新码头实例。按顺序执行是可行的,但是,并行执行时我遇到了异常。

org.jboss.weld.exceptions.DefinitionException: 
    Exception List with 1 exceptions:|Exception 0 
    :|java.lang.RuntimeException: javax.naming.NameAlreadyBoundException: 
     com<|?at com.sun.jersey.server.impl.cdi.CDIExtension.initialize(CDIExtension.java:196)

完整的堆栈跟踪位于pastebin

服务器和上下文在不同的码头服务器实例和端口上隔离。然而,Weld 并没有意识到这一点,尽管它检测到了一个 Jetty 容器并且似乎在某个地方使用了共享状态(也许这是 Jetty 特定的?)。

有没有人遇到过这个问题或有提示如何告诉 Weld 它不应该注册两次?

【问题讨论】:

  • 为什么不把堆栈跟踪放在这里?
  • 因为比较长,不知道可读性如何。

标签: java deployment jetty cdi weld


【解决方案1】:

您可以尝试对每个测试进行 fork,因此它们都在不同的 JVM 中完成。看起来 Weld 正在为每个 JVM 存储 bean(这是有道理的),并且当启动新服务器时,它会再次通过引导程序运行。

【讨论】:

  • 是的,我原本以为是焊接/码头集成正在这样做,但仔细观察我认为@LightGuard 是正确的,他的解决方案似乎可以启动
  • 这是我的第一个想法,我看到的问题是我必须将每个测试方法划分为自己的测试类。但也许这值得为我节省时间进行测试。
  • 另外一点:像 Weld 这样的容器框架应该隔离这个吗?因为在不同的上下文中部署同一个 bean 两次是可行的。
  • 当您说“上下文”时,您到底在说什么(所以我们在同一页上)? Weld 为每个 bean 描述符存档保留有关 bean 的元数据(在您的情况下,这将是 jvm,因为测试未捆绑在 jar 中),多次保存元数据是没有意义的,并且还可能导致您使用哪个元数据当你要求一个新的实例时得到。
猜你喜欢
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2016-02-11
  • 2020-05-21
  • 2021-10-22
  • 1970-01-01
  • 2015-12-04
相关资源
最近更新 更多