Jakarta ee @TOME中的异步方法生成内存泄漏日志错误
我在一个单例类中有一个Jakarta ee @TOME中的异步方法生成内存泄漏日志错误,jakarta-ee,asynchronous,ejb,apache-tomee,Jakarta Ee,Asynchronous,Ejb,Apache Tomee,我在一个单例类中有一个@Asynchronous方法,该方法从EJB调用以在系统中执行一些清理 @Singleton public class AuthTokenCleanup { @Inject AuthTokenService tokenService; @Asynchronous @Lock(LockType.READ) @TransactionAttribute(NOT_SUPPORTED) public void scheduleCl
@Asynchronous
方法,该方法从EJB调用以在系统中执行一些清理
@Singleton
public class AuthTokenCleanup {
@Inject
AuthTokenService tokenService;
@Asynchronous
@Lock(LockType.READ)
@TransactionAttribute(NOT_SUPPORTED)
public void scheduleCleanupAuthTokens() {
try {
Thread.sleep(5000);
tokenService.cleanup();
} catch (InterruptedException ex) {
}
}
}
调用singleton的代码片段。它位于一个无状态的EJB中
public boolean authenticate(String username, String password) {
boolean authenticated = false;
try{
Login login = loginLookup.findByUsername(username);
authenticated = login.equalPassword(password);
} finally {
tokenCleanup.scheduleCleanupAuthTokens(); //token cleanup happens here
}
return authenticated;
}
取消部署应用程序大约需要20-30秒。
我在catalina日志文件中看到以下错误
SEVERE: The web application [/MyApp]
appears to have started a thread named [@Asynchronous MyApp-1.0-SNAPSHOT - 3]
but has failed to stop it. This is very likely to create a memory leak.
我正在Apache-tomee-1.7.1-jaxrs上运行该应用程序。
我的pom.xml配置的一个片段
<properties>
<tomee.version>1.7.1</tomee.version>
<openejb.javaee.api>6.0-6</openejb.javaee.api>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
1.7.1
6.0-6
${project.build.directory}/project
UTF-8
org.apache.maven.plugins
maven编译器插件
3.2
1.7
1.7
${annowed.dir}
当我删除@Asynchronous
调用时,取消部署需要1-3秒,并且日志文件中没有错误
当使用
@异步
方法调用时,TOME中是否会出现预期的行为和错误?如果不是,我做错了什么?EJB规范要求EJB组件不这样做(包括线程.sleep()
)。这是因为容器需要处理线程管理,而如果应用程序正在这样做,容器将无法有效地处理线程管理
如果清理任务需要定期在单例中完成,您是否考虑过使用
@Schedule
注释使用?这将更适合EJB模型,也意味着您不会为处理的每个调用启动新的异步请求,因此它的扩展性可能也会更好。我发现Thread.sleep(5000)代码>导致日志文件中出现取消部署时间和错误。有没有一种方法可以让异步调用在一段时间后执行,但也符合EE container中的线程遵从性的休眠或超时?