메시지에 구독자 목록이 있습니다.
구독자가 메시지를 열 때마다 구독자 수가 1 줄입니다. 따라서 구독자 수가 0 인 메시지를 찾는 데 문제가 있습니다.
나쁜 생각입니다.
개체 삭제 대기열을 마련해야합니다. 가입자가 메시지를 열 때마다 가입자 수를 확인합니다. 0이면 메시지 구독자가 메시지를 삭제 대기열에 제출합니다. 이제 GC 스레드는 삭제 대기열 만 모니터링해야합니다.
왜 카운터를 가지고 있어야합니다. 메시지 구독자 목록은 연결된 토큰 목록입니다. 각 가입자는 목록의 하나의 토큰과 연관됩니다. 토큰은 가입자에게 메시지가 있음을 알려줍니다.
메시지 큐가 네트워크에서 작동하는 경우 구독자 당 토큰이 생성되고 토큰은 순환 목록에 연결됩니다. 목록의 각 토큰에 대해 해당 토큰이 생성되어 구독자에게 전송됩니다. 구독자 요청 메시지 검색시 메시지 큐 관리자에 인증 토큰을 제출합니다. 메시지 대기열 관리는 토큰을 인증하고 구독자가 메시지에 액세스 할 수있게 한 다음 토큰을 목록에서 연결 해제합니다.
네트워크 메시지 대기열 또는 로컬 시스템 대기열에 관계없이 마지막 토큰이 연결 해제 된 경우 (원형 목록이므로 마지막 토큰임을 알 수 있음) 메시지는 삭제 대기열에 제출됩니다.
왜 별도의 스레드가 필요합니까? 코드가 이미 다중 스레드되지 않은 한, 코드 스레드를 안전하게 유지해야하는 복잡성이 있습니다. 보낸 후 정리 코드가 실행되지 않는 이유는 무엇입니까? – selbie
성능에 영향을 미치기를 원하지 않았습니다. 그러나 참조 카운팅 아이디어가 좋습니다. – slartibartfast
왜 성능에 영향을 미칠 것이라고 생각합니까? 프로파일 링 도구로 측정 했습니까? 성능 문제는 거의 자신이 생각하는 곳에서 발생하지 않습니다. – selbie