Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用异步方法EJB时的奇怪行为?_Java_Asynchronous_Jakarta Ee_Dependency Injection_Ejb - Fatal编程技术网

Java 调用异步方法EJB时的奇怪行为?

Java 调用异步方法EJB时的奇怪行为?,java,asynchronous,jakarta-ee,dependency-injection,ejb,Java,Asynchronous,Jakarta Ee,Dependency Injection,Ejb,在调用异步方法时,我有一个奇怪的行为,该方法在一个循环中通过两次迭代被调用。实际上它已经被调用了两次,但是最后一次调用了参数值,但是参数在循环中被改变了 Example : first iteration : tenant_id=11 second iteration :tenant_d=10 调试异步函数时,两次调用参数值为10 异步函数: @Stateless public class StatisticsMigrator { @Asynchronous @Transa

在调用异步方法时,我有一个奇怪的行为,该方法在一个循环中通过两次迭代被调用。实际上它已经被调用了两次,但是最后一次调用了参数值,但是参数在循环中被改变了

Example : 
first iteration : tenant_id=11 
second iteration :tenant_d=10
调试异步函数时,两次调用参数值为10

异步函数:

@Stateless
public class StatisticsMigrator {
    @Asynchronous
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void doMigrate(final ConnectionParameters params) {
    LOG.debug("migration has been started in asynchronous mode);
    }
}


@Path("{/endpoint}")
public class WebService
{
    @Inject
    StatisticsMigrator migrator;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/general/")
    public Response migrate(@Context final HttpHeaders 
     argHeaders)
    {
        ConnectionParameters par=ConnectionParameters.creatConnectionParamsObject(baseUri, argHeaders.getHeaderString("Authorization"),tenantId);

        for (Tenant tenant : tenants) {
            par.setTenantId(String.valueOf(tenant.getRetailerId()));
            migrator.doMigrate(par);
      }
    }

}

将同一对象传递给该方法两次,然后异步调用该方法。所以在实际调用时,这两个调用接收相同的对象,处于相同的最新状态。调用异步方法时最好使用不可变对象(因为对象是从两个线程访问的),因此应该创建两个单独的不可变实例。@JBNizet您是对的问题在于第二个线程重写了第一个线程的值。但实际上我没有想到它会运行到多线程模式,特别是从ejb文档中可以看出,不允许从ejb管理线程,因为这会损害资源管理、事务管理和安全性。你能解释一下吗?在调用异步方法时,你不是在自己创建和启动线程。容器为您处理线程。即使这两个方法调用由同一个异步线程执行,它们也会在for循环结束后执行。