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循环结束后执行。