프로듀서 끝에서 흐름 제어 상황을 처리하려고합니다. 최대 대기열 크기가 설정된 qpid-broker에 대기열이 있습니다. 또한 queue에 flow_stop_count 및 flow_resume_count를 설정하십시오.아파치 qpid를 사용하는 동안 jms 메시징에서 프로듀서 흐름 제어를 처리하는 방법
이제 제작자는이 flow_stop_count에 도달 할 때까지 계속 메시지를 생성합니다. 이 수를 초과하면 Exception listener가 처리하는 예외가 발생합니다. 이제 언젠가 큐의 소비자가 따라 잡을 것이고 flow_resume_count에 도달하게 될 것입니다. 문제는 생산자가이 사건에 대해 어떻게 알고 있는지입니다. 여기
는 생산자connection connection = connectionFactory.createConnection();
connection.setExceptionListenr(new MyExceptionListerner());
connection.start();
Session session = connection.createSession(false,Session.CLIENT_ACKNOWLEDGE);
Queue queue = (Queue)context.lookup("Test");
MessageProducer producer = session.createProducer(queue);
while(notStopped){
while(suspend){//---------------------------how to resume this flag???
Thread.sleep(1000);
}
TextMessage message = session.createTextMessage();
message.setText("TestMessage");
producer.send(message);
}
session.close();
connection.close();
의 샘플 코드이고 예외 청취자
private class MyExceptionListener implements ExceptionListener {
public void onException(JMSException e) {
System.out.println("got exception:" + e.getMessage());
suspend=true;
}
}
을 위해 지금 exceptionListener로 예외에 대한 일반적인 수신기, 그래서 일시 중지하는 것이 좋습니다 안 그것을 통한 생산자 흐름.
내가 필요한 것은 아마도 메시지를 보내기 전에 확인하는 데 사용할 수있는 produer.isFlowStopped()과 같은 생산자 수준의 메소드 일 것입니다. 이러한 기능이 qpid api에 존재합니까?
qpid website에는 이것이 가능하다고 제안하는 문서가 있습니다. 그러나 나는 어디에서든지 이것이 행해지는 어떤 예도 발견 할 수 없었다.
이러한 종류의 시나리오를 처리하는 표준 방법이 있습니까?
예. 나는 이것을 정확히 수행해야만했다. 예외가 생기면 메시지를 보내지 않고 대기열 크기를 확인하기 위해 폴링을 멈춘다. qpid api는 메소드가 현재 큐 크기를 알 수있게 해줍니다. 흐름이 멈출 때를 나타내는 것은 아닙니다. 따라서 큐 크기를 예외로 사용하고 큐 크기가 떨어질 때 생산자를 중지시켜 최대 값 (예외 큐 크기)의 80 %라고 말할 수 있습니다. – Raks
예 선점하는 것이 좋습니다. qpid가 빌드되는 방식은 큐가 꽉 차있을 때 다소 흥미 롭습니다. 그런 다음 예외를 던지기 전에 최대 2 분 동안 전송을 차단합니다. 이는 장기간의 블로킹 작업을 처리 할 수 없다면 제작자 코드가 불안정해질 수 있음을 의미합니다. – aldridmc