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中的线程遵从性的休眠或超时?