【发布时间】:2020-04-03 11:38:25
【问题描述】:
我正在尝试了解如何使用 Jax-RS 和 CDI 在我的项目中管理计划任务。
使用 Spring,我可以通过 ThreadPoolTaskScheduler 或 @Scheduled 注释轻松实现这一目标,并且我尝试两种方式都没有成功。
首先,我使用的是 Wildfly 14,这似乎会导致一些问题,因为我尝试使用 @Resource 注入 ManagedScheduledExecutorService 和 TimerService 但 Wildfly 抛出缺少依赖项的异常(但管理员指南没有帮助我)。
我尝试使用这样的单例对象,而不是注入资源:
@Singleton
public class CacheManager {
private final static Logger log = LogManager.getLogger();
public CacheManager() {
log.error("######## Init" + LocalTime.now());
}
@Schedule(hour = "*", minute = "*", second = "*/1")
private void timeout() {
log.error("######## " + LocalTime.now());
}
}
但该方法永远不会被调用。
所以我不明白我错过了什么。也许我错误地配置了项目,所以这是我的 pom.xml 依赖项:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
<!-- Import the JAX-RS API, we use provided scope as the API is included in JBoss WildFly -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>3.10.0.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>jaxrs-api</artifactId>
<version>3.0.12.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-multipart-provider</artifactId>
<version>3.0.12.Final</version>
<scope>provided</scope>
</dependency>
<!-- Import the CDI API, we use provided scope as the API is included in JBoss WildFly -->
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- Import the JSF API, we use provided scope as the API is included in JBoss WildFly -->
<dependency>
<groupId>org.jboss.spec.javax.faces</groupId>
<artifactId>jboss-jsf-api_2.2_spec</artifactId>
<version>2.2.14</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.2</version>
</dependency>
<dependency>
<groupId>javax.ejb</groupId>
<artifactId>ejb-api</artifactId>
<version>3.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
这是我的 beans.xml
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" bean-discovery-mode="annotated">
</beans>
我正在使用 Java 8。
编辑:CacheManager 在 JAX-WS 应用程序中实例化
@ApplicationScoped
@ApplicationPath("/rest")
public class JaxRsActivator extends Application {
private static final Logger logger = LogManager.getLogger();
private Set<Object> singletons = new HashSet<Object>();
private HashSet<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
singletons.add(new CorsFilter());
singletons.add(new CacheManager());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
@Override
public HashSet<Class<?>> getClasses(){
return classes;
}
}
【问题讨论】:
-
你是否让它与一个普通的 servlet 一起工作?还是普通的jsp?还是一个jax-ws?还是JSF?甚至是单元测试? 99% 确定这与 jax-rs 无关。
-
Jax-ws 工作正常。
-
我不是这个意思。通过声明它不适用于 jax-rs,您隐含地声明当您想通过 servlet 或其他方式启动它时没有问题。您的问题中实际上没有任何与 jax-rs 相关的内容。创建一个servlet,它在那里工作吗?如果不是,您的问题更普遍,您可以搜索更普遍的解决方案/问题。
-
好的,现在有了,但是您对 CacheManager 进行了“新”操作...然后它不是托管实例,由 CDI 之类的容器或其他容器管理。实际上,您在单元测试或 servlet 中会遇到同样的问题,或者......至少我是这么认为的。我使用 jax-rs,但仅将
Application扩展类用于纯 jax-rs 的事情。其他真正的 应用程序范围的事物是通用的@ApplicationScoped事物。所以我不确定你是否尝试使用 JaxRS 特定但设计明智的东西,我不会这样做 -
是的,你是对的。我已经从 Jax-rs 初始化器中删除了 CacheManager,并在 CacheManager 上添加了一个 @Startup 注释,所以现在开始使用它自己的应用程序。
标签: java multithreading jax-rs cdi