로그인 메소드 중에 통계를 비동기 적으로 저장하여 로그인 시간을 절약하려고합니다. 하지만 어떻게 든 비동기 메서드에 thread.sleep을 추가하면 로그인 프로세스가 더 오래 걸립니다. 왜 그런가요? 나는 authenticate 메소드가 writeResultToStats 메소드가 끝날 때까지 기다리지 않을 것이라고 생각했다.호출 방법 EJB의 비동기
@Stateless
@LocalBean
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@TransactionManagement(TransactionManagementType.CONTAINER)
public class CustomerBeanTest {
@PersistenceContext(unitName = WebPersistenceUnits.QISADS)
private EntityManager em_local;
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void authenticate(Long loginid, String cmppassword) {
try {
Login l = em_local.find(Login.class, loginid);
String s = l.getPassword();
if (!s.equalsIgnoreCase(cmppassword))
throw new PasswordMissmatchException();
writeResultToStats(loginid, true);
} catch (PasswordMissmatchException e) {
writeResultToStats(loginid, false);
}
}
@Asynchronous
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void writeResultToStats(Long loginID, boolean success) {
try { // just for testing
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
LogUtils log = new LogUtils(this);
Login l = em_local.find(Login.class, loginID);
if (success) {
l.setSuccessLast(new Date());
l.setSuccessCount(l.getSuccessCount()+1);
log.log(Level.INFO, "Update Login Stat Success [%d, %s, %d]", l.getId(), l.getName(), Thread.currentThread().getId());
} else {
l.setFailureLast(new Date());
l.setFailureCount(l.getFailureCount()+1);
log.log(Level.INFO, "Update Login Stat Fail [%d, %s, %d]", l.getId(), l.getName(), Thread.currentThread().getId());
}
}
}
:
하지만 그 대신 다른 빈을 만드는, 당신은의 SessionContext를 통해 비동기 Bean 메소드를 호출 할 수 있습니다. 지금은 로컬 메서드 호출로 처리됩니다. –
이 문제를 해결하고 다시 돌아 오게하십시오 –
그것은 작동합니다. 감사. –