2017-11-03 1 views
1

ActiveMQ에는 실제로 메시지가 수신되었음을 알리는 AUTO Acknowledge라는 기능이 있습니다 (생산자를 인정하지 않음).소비자의 승인을 생산자에게 보내고 activemq 및 rabbitmq에서 처리합니다.

ActiveMQ 또는 RabbitMQ에서 소비자의 승인을 보낼 수 있는지 알고 싶습니다. 생산자에서 확인 응답 메시지를 처리하고 응답을받지 못하면 소비자에게 다시 메시지를 보냅니다.

+2

MQ를 신뢰하지 않거나 동기/차단 호출을 찾고있는 것처럼 들립니다. 후자 인 경우 HTTP와 같은 방식으로 설계된 무언가로 이동하지 않으시겠습니까? – chrylis

답변

0

비동기 매체를 통해 동기식 유즈 케이스를 수행하려고합니다.

의심 RPC를 피할 때 : https://www.rabbitmq.com/tutorials/tutorial-six-python.htmlhttps://www.rabbitmq.com/direct-reply-to.html

을 심지어 저자는 그것을 피하기 위해 조언을 통지하십시오 - 여기에 설명 된대로

는 RabbitMQ의 경우는, RPC를 사용할 수 있습니다. 가능한 경우 RPC와 같은 차단 대신 비동기 파이프 라인을 사용해야합니다. 결과는 비동기 적으로 다음 계산 단계로 푸시됩니다.


RabbitMQ 자바 클라이언트는 자동 응답 (ACK) com.rabbitmq.client.Channel.basicConsume을 통해 제공합니다.

0

은 적어도 ActiveMQ를위한 -이 내장되어 당신은 단순히 당신이 소비 메시지를 모니터링 할 큐에 대한 자문 주제를 듣고 activemq.xml

<policyEntry queue=">" advisoryForConsumed="true"/> 

에 전원을 켜해야합니다.. 그런 다음 메시지 ID를 추출 할 수 있으며 미해결 요청을 "체크"하지 않을 수 있습니다.

완전한 종단 간 확인을 위해 더 많은 맞춤 설정을 권합니다. 나는. 제작자 앱은 생성 된 메시지의 상태에 대한 응답을받는 "응답"대기열을 청취해야합니다. 나는. 처리가 실패한 경우 이유 등을 알고 싶을 수 있습니다.

어쨌든 여기에 ActiveMQ의 수신 확인을 수신하는 제작자가있는 코드가 있습니다.

public void run() throws Exception { 
    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
    conn = cf.createConnection(); 
    sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    Destination dest = sess.createQueue("duck"); 
    MessageConsumer mc = sess.createConsumer(AdvisorySupport.getMessageConsumedAdvisoryTopic(dest)); 
    mc.setMessageListener(this); 
    conn.start(); 

    MessageProducer mp = sess.createProducer(sess.createQueue("duck")); 
    mp.send(sess.createTextMessage("quack")); 
} 


public void onMessage(Message msg) { 
    try { 
     String msgId = msg.getStringProperty("orignalMessageId"); 
     System.out.println("Msg: " + msgId + " consumed"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
관련 문제