2017-05-08 10 views
0

우리 프로젝트에서 나는 메시지를 ActiveMQ에 푸시하고 지속성을 유지해야합니다. 새 메시지를 보내고 메모리 제한을 초과하면 대기열에서 가장 오래된 메시지가 삭제되거나 대기열에서 제거되거나 새 메시지로 교체되어야합니다.ActiveMQ 메모리 제한이 초과 된 후 큐에서 메시지 삭제 시작

전체 큐를 지우고 싶지 않습니다. 큐는 우리 제품의 페일 세이프 메시지 백 로그와 같이 작동하므로 큐에 마지막 x 개의 메시지를 보관해야합니다.

나는 지금까지 구글과 행운을 보려고 노력했다. 여기

는 큐의 서비스 계약으로 대기열에 사용할 수 없습니다 축출 정책 개체는 주제에 적용 내 정책 Settings.XML이

<destinationPolicy> 
     <policyMap> 
      <policyEntries> 
       <policyEntry queue=">" producerFlowControl="false" memoryLimit="5mb" > 

        <messageEvictionStrategy> 
        <oldestMessageEvictionStrategy/> 
        </messageEvictionStrategy> 

      <pendingMessageLimitStrategy> 
       <constantPendingMessageLimitStrategy limit="100"/> 
      </pendingMessageLimitStrategy> 

       </policyEntry> 
      </policyEntries> 
     </policyMap> 
    </destinationPolicy> 

답변

1

입니다 그들 중 하나가 될 때까지이 모든 메시지를 저장한다는 것입니다 소비 또는 수명은 설정된 TTL 값을 통해 만료됩니다. 브로커는 대기열에 디스크에 메시지를 저장하여 메모리에서 메시지를 제거 할 수 있지만 토픽의 경우 계약이 느슨해지고 퇴거 정책에 따라 메모리에있는 메시지가 토픽 소비자에게 발송되도록 대기 할 수 있습니다.

TTL 값을 통해서만 대기열의 메시지 수명을 제어 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. –

0

우리가 삭제하거나 소비하지 않는 한 디스크에서 영구 메시지를 제거 할 수 없습니다. producerFlowControl을 사용하여 제작자를 제한하여 이전 메시지를 큐에서 소비 한 후 또는 Tim에서 메시지에 TTL을 설정하도록 제안 할 때 새로운 메거지를 허용 할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. –