1

我试图在我的 Quartz 应用程序中初始化 CDI-SE 上下文,所以我有以下依赖项(maven):

  <dependency>
                <groupId>org.jboss.weld.se</groupId>
                <artifactId>weld-se-core</artifactId>
                <version>2.3.4.Final</version>
            </dependency>

在我的 JobQuartz 中,我有 execute() 方法,其中包含以下内容:

public void execute(JobExecutionContext context) throws JobExecutionException {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        service = container.instance().select(MyService.class).get();
        service.go();
        weld.shutdown();
    }

但我收到以下错误:

Caused by: java.lang.IllegalStateException: WELD-ENV-002009: Weld SE container cannot be initialized - no bean archives found

我的项目是 WAR,所以我把 beans.xml 文件放在里面/src/main/webapp/META-INF/,看内容:

<?xml version="1.0"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="all">

</beans>

我将文件复制到/src/main/resource/META-INF,但我得到了同样的错误。

4

2 回答 2

1

在评论部分进行了一些对话后,我想我理解的足够回答你了。

首先,您不应该自己启动 Weld SE 容器,因为您有两个并排运行的容器(不打算/不支持) - 一个 SE 和一个由容器处理的“经典”。坚持使用容器处理的容器,它会为您轻松启动。

现在,我看到您缺少一些范围激活方法。如果您正在使用一些较新版本的 Weld,您可以使用一个拦截器,它将RequestContext在一个方法之前激活(我想那是您之后的那个)并在之后将其拆除。你所需要的只是对 Weld API(无论如何都包含在 WFLY 中)的依赖,然后你只需用它来注释你的方法或类。

对于上述情况,您需要 Weld 2.4.x。请注意,您可以非常简单地修补您的 WildFly。补丁位于Weld 网站的底部,操作方法可在此处找到。

如果您要使用 Weld 3/CDI 2.0,那么甚至还有一个内置的 bean ( RequestContextController) 可以让您控制这个生命周期。

另一个选择是 Deltaspike,正如 Johm Ament 指出的那样,但这需要你引入另一个依赖项。

于 2017-11-21T13:01:46.433 回答
0

如果您要做的是启动请求上下文,那么您有几个解决方案。

  1. 为 CDI 使用 DeltaSpike 的 Quartz 集成 - http://deltaspike.apache.org/documentation/scheduler.html

  2. 以编程方式启动和停止上下文使用BoundRequestContext(它是您可以注入的 CDI bean)。

我强烈推荐使用 DeltaSpike 方法,因为它会处理自动启动上下文所需的所有设置。

于 2017-11-21T12:05:48.577 回答