0
コンシューマがプロデューサからメッセージをすでに受信しているかどうか、またはプロデューサにSpring JMSでメッセージがすでに送信/消費されたことをプロデューサに通知する方法を教えてください。Spring JMSプロデューサとコンシューマとのやりとり
コンシューマがプロデューサからメッセージをすでに受信しているかどうか、またはプロデューサにSpring JMSでメッセージがすでに送信/消費されたことをプロデューサに通知する方法を教えてください。Spring JMSプロデューサとコンシューマとのやりとり
プロデューサ側でorg.springframework.jms.core.JmsTemplate.sendAndReceive(...)
を使用して要求/応答を使用する必要があり、コンシューマ側では、コンテナに設定されたMessageListenerメソッドが値を返す必要があります。
やあなたのプロデューサーは、メッセージがorignalMessageId
のようないくつかのプロパティにアクセスすることによって消費されたときに通知されるようにActiveMQ.Advisory.MessageConsumed.Queue
に加入させる、ここでhttp://activemq.apache.org/advisory-message.html
を見て、あなたはこのようにそれを使用することができます:
Destination advisoryDestination = org.apache.activemq.advisory.AdvisorySupport
.getMessageConsumedAdvisoryTopic(session.createQueue("yourQueue"));
MessageConsumer consumer = session.createConsumer(advisoryDestination);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message msg) {
System.out.println(msg);
System.out.println(((ActiveMQMessage) msg).getMessageId());
ActiveMQMessage aMsg = (ActiveMQMessage) ((ActiveMQMessage) msg).getDataStructure();
System.out.println(aMsg.getMessageId());
}
});
通知する場合はAUTO_ACKモードを使用できますが、例外が発生した場合に再配信が必要な場合は、transacted = "true"を使用する必要があります。これはすでにSOで尋ねられています。これを確認してください:http://stackoverflow.com/questions/9095471/getting-a-simple-spring-jms-client-acknowledge-to-work – Tarun