매우 간단한 비동기 처리 요구 사항의 경우, java.util.concurrent 패키지의 적합한 클래스를 사용할 수 있습니다.
시스템 오류 (소프트웨어 또는 하드웨어 충돌)의 경우에도 제출 된 작업을 성공적으로 완료해야한다는 트랜잭션 또는 작업 처리가 필요하거나 작업 처리를 다른 프로세스로 오프로드하려는 경우 다른 해결책이 필요합니다 .
JMS 접근 방식은 비교적 적은 노력으로 매우 정교한 솔루션을 제공 할 수 있습니다.
메시징 (JMS)은 비동기 작업 제출을 유지하고 실제 처리에서 분리 된 작업 제출을 유지하는 문제를 해결할 수있는 매우 표준 통합 솔루션입니다. 메시징 기반 솔루션은 작업 대기열에서 청취하는 '작업 프로세서'스레드 수를 늘림으로써 쉽게 확장 할 수 있습니다. 트래픽은 자동으로로드 밸런싱됩니다. 메시징 시스템은 트랜잭션 지원을 제공 할 수도 있습니다. 즉, 작업 처리가 실패하여 재 시도 될 수있는 경우 자동으로 메시지를 대기열에 다시 넣을 수 있습니다.
많은 엔터프라이즈 통합 패턴은 메시징 시스템 (메시지 지향적 인 미들웨어)을 기반으로합니다. Enterprise Integration Patterns by Gregor Hohpe에 대한이 책에는 응용 프로그램에서 메시징을 사용하는 방법에 대한 가장 보편적 인 패턴이 있습니다. 작업 처리 중 작업의 행 상태를 업데이트 결국 처리 응용 프로그램 시작 때
데이터베이스 접근 방식은 '새로운 일자리'에 대한 테이블을 폴링 행의 상태를 업데이트
1)에 다른 프로세스가 필요합니다 '완료'(또는 테이블에서 작업을 모두 삭제). 2) 작업 처리 중에 문제가 발생하면 작업 상태를 테이블에서 '새'로 다시 변경해야하므로 '폴링'메커니즘이 작업을 다시 선택할 수 있습니다. 또한 시스템 시작시 '복구 스레드'를 작성하여 일관성없는 상태에있는 작업을 찾아서 '새'상태로 되돌려 처리를 다시 시작해야 할 필요성이 있습니다.
결론은 데이터베이스를 기반으로하는 통합 솔루션을 구축하는 데 많은 노력이 필요하다는 것입니다. 또한 '작업 제출자'및 '작업 프로세서'어플리케이션을 데이터베이스의 캡슐화를 깨는 데이터베이스 스키마와 긴밀하게 결합합니다. '작업 프로세서'에 다중 스레드가있는 경우 (규모를 조정하려면 필요할 것입니다) 하나의 스레드 만 작업을 선택하고 '그'행을 업데이트해야합니다.
JMS 솔루션은이 모든 로직을 직접 코딩하지 않아도이 문제를 매우 쉽게 해결합니다.
확실히 대기열을 사용하는 경우 엉망이 아닙니다. 그러나 메시징 미들웨어를 소개하는 데는 유효한 유스 케이스가 있어야합니다.
이러한 접근 방식은 JMS보다 간단하게 들리지 않습니다. –
@ kaleb, 아마도. JMS 접근법의 모든 부분을 대안으로 나란히 배치하는 것은 가치가있을 것입니다 ... – hvgotcodes
어딘가에있는 테이블은 JMS와 마찬가지로 많은 의존성을 가지고 있습니다 – ChrisBlom