저는 약간의 배경을 가지고 있습니다. 저는 최근에 수석 개발자가 퇴사 한 후 주요 프로젝트를 인수 한 새로운 개발자로서, 어떻게 구조화되었는지 완전히 이해할 수있게되었습니다. 내가 할 수있는 한 최선을 다해 문제를 설명하려고 노력할 것이다.@Transactional을 사용하는 메소드에서 스프링 빈 멈춤
이 응용 프로그램은 JMS 대기열에서 객체를 읽는 여러 MessageListner 스레드를 만듭니다. 객체가 수신되면 데이터는 비즈니스 로직을 기반으로 조작 된 다음 최대 절전 모드 EntityManager를 사용하여 오라클 데이터베이스에 저장 될 지속 객체에 매핑됩니다.
몇 주 전까지 만해도 프로젝트에 참여한 이후 지난 1 년 동안이 구성에 큰 문제가 없었습니다. 그러나 대기열 중 하나 (이 문제는이 특정 대기열과 격리되어 있음)의 경우 수신 된 객체를 처리하는 스프링 관리 Bean은 아래 메소드에서 중단됩니다. 디버깅을 통해 메소드 내 모든 작업이 완료되었지만 완료되면 중단됩니다. 이 문제를 해결하기 위해 몇 주 동안 노력한 끝에 저는이 문제로 제 밧줄 끝에 섰습니다. 이것에 대한 어떤 도움도 크게 감사 할 것입니다.
각 MessageListner는 자체 프로세서를 가지기 때문에이 행잉 방법은 하나의 큐에 들어오는 데이터에만 영향을줍니다.
@Transactional(propagation = Propagation.REQUIRES_NEW , timeout = 180)
public void update(UserRelatedData userData, User user,Company company,...)
{
...
....
//business logic performed on user object
....
......
entityMgr.persist(user);
//business logic performed on userData object
...
....
entityMgr.persist(userData);
...
....
entityMgr.flush();
}
디버그 문을 삽입하여 메서드를 살펴보고 entityMgr.flush.()를 포함한 모든 작업을 완료했습니다.
이것은 오래된 것입니다. 그러나 비슷한 문제가있는 경우에 대비하여 다시 설명하겠습니다.데이터베이스와 관련된 문제로 밝혀졌습니다. DBA와의 여러 차례 회의를 마침내 해결했습니다. – Rhouujin
무엇이 문제였습니까? – Robocide