문제

activemq를 브로커로 사용하여 메시지를 제공합니다.Theses 메시지는 Dabatase에서 작성 될 의도가 있습니다.때로는 데이터베이스에 도달 할 수 없거나 다운됩니다.이 경우 나중에이 메시지를 다시 시도하기 위해 내 메시지를 롤백하고 다른 메시지를 계속 읽고 싶습니다.

이 코드는 하나의 지점을 제외하고는 잘 작동합니다. 롤백 메시지가 다른 사람을 읽지 않도록 차단합니다.

private Connection getConnection() throws JMSException {
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
    redeliveryPolicy.setMaximumRedeliveries(3); // will retry 3 times to dequeue rollbacked messages
    redeliveryPolicy.setInitialRedeliveryDelay(5 *1000);  // will wait 5s to read that message

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);
    Connection connection = connectionFactory.createConnection();
    ((ActiveMQConnection)connection).setUseAsyncSend(true);
    ((ActiveMQConnection)connection).setDispatchAsync(true);
    ((ActiveMQConnection)connection).setRedeliveryPolicy(redeliveryPolicy);
    ((ActiveMQConnection)connection).setStatsEnabled(true);
    connection.setClientID("myClientID");
    return connection;
}
.

이 방법으로 세션을 생성합니다.

session = connection.createSession(true, Session.SESSION_TRANSACTED);
.

롤백이 쉽습니다.

session.rollback();
.

내 대기열에 3 개의 메시지가 있는지 상상해 보겠습니다.

1: ok
2: KO (will need to be treated again : the message I want to rollback)
3: ok
4: ok
.

소비자가 할 것입니다 (선형 순서) :

commit 1 
rollback 2
wait 5s
rollback 2
wait 5s
rollback 2
put 2 in dead letter queue (ActiveMQ.DLQ)
commit 3
commit 4
.

하지만 원하는 :

commit 1
rollback 2
commit 3
commit 4
wait 5s
rollback 2
wait 5s
rollback 2
wait 5s
put 2 in dead letter queue (ActiveMQ.DLQ)
.

그래서 나중에 롤백 메시지를 지연시키기 위해 소비자를 어떻게 구성 할 수 있습니까?

도움이 되었습니까?

해결책

이것은 브로커가 아닌 클라이언트가 메시지 재시도가 처리되기 때문에 실제로 예상되는 동작입니다.따라서 1 개의 세션 바인딩이 있고 재시도 정책이 DLQ 앞에 3 재시도를 설정하기 때문에 전체 재시도 프로세스가 특정 스레드를 블록합니다.

그래서 첫 번째 질문은 데이터베이스 삽입이 실패하면 비슷한 이유로 나머지 DB 삽입물이 모두 실패 할 것으로 기대하지 않는다는 것입니다.

그렇지 않은 경우 해당 대기열에 대한 재시도 정책을 특정 DLQ로 0 재 시도로 설정하여 메시지가 즉시 실패하고 DLQ로 들어가는 것입니다.그런 다음 5 초마다 DLQ를 가져오고 처리를 위해 처리 및 / 또는 처리를 위해 메인 대기열에 다시 넣는 다른 프로세스가 있습니다.

다른 팁

<strictOrderDispatchPolicy /> activeMQ XML 구성 파일을 사용하고 있습니까?이것이 배송 배달에 대한 메시지의 순서에 영향을 미치는지 확실하지 않습니다.엄격한 주문 디스패치를 사용하는 경우 해당 정책을 변경하여 동작을 변경하는지 확인하십시오.

Bruce

나는 동일한 문제가 있었다, 나는 여기서 솔루션을 발견하지 못했다. 이는 연결 팩토리에서 TRUE로 PROTENT NONBLOCKINGELIVILIVALIVEL을 설정할 때 버전 5.6 이전에 수정되었습니다.

<property name="nonBlockingRedelivery" value="true" />
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top