要件:onMessage()
正常に実行されるまでメッセージをキューに保持したい。の実行中に何らかの例外が発生しonMessage()
、それがハンドルされていない場合、メッセージはリスナーに再配信される必要があります。
アプリケーション サーバーとして Glassfish v2 を使用しています。OpenMQConnectionFactory と JmsTemplate を使用してメッセージをキューに送信しています。 私は MDB を使用していないことに注意してください。
<bean id="openMQConnectionFactory"
class="com.is.br.util.OpenMqConnectionFactoryBean">
<property name="imqAddressList" value="mq://localhost:7676" />
<property name="imqDefaultUsername" value="admin" />
<property name="imqDefaultPassword" value="admin" />
</bean>
応答モードとして AUTO_ACKNOWLEDGE を試しましたが、例外がスローされたメッセージが再配信されないときにリスナーで試しました。
MessageProducer.java
public void sendMessage(最終文字列 responseStream) {
System.out.println("Enter into IsJmsProducer.sendMessage method");
try {
MessageCreator creator = new MessageCreator() {
public Message createMessage(Session session) {
ObjectMessage message = null;
try {
message = session.createObjectMessage(responseStream);
} catch (Exception e) {
System.out.println("Unable create a JMSMessage");
}
return message;
}
};
System.out.println("Sending message to destination: " + this.destination.toString());
this.jmsTemplate.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
this.jmsTemplate.send(this.destination, creator);
System.out.println("SendMessage to queue successfully.");
} catch (Exception ex) {
System.out.println("SendMessage to queue Fail." + ex);
}
System.out.println("Exit from IsJmsProducer.sendMessage method");
}
サンプルJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
throw new RuntimeException();
}
}
次にthis.jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
、私が呼び出したリスナーで 試してみましたが、まだメッセージを呼び出しmessage.acknowledge();
たcatch
ブロックで再配信されません。session.recover()
サンプルJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
ObjectMessage objectMessage = (ObjectMessage) message;
Object object;
try {
object = objectMessage.getObject();
if (object instanceof String) {
System.out.println("Message received - " + object.toString());
throw new JMSException("JMS exception");
}
message.acknowledge();
} catch (JMSException e) {
session.recover();
}
}
}
プログラムをデバッグ モードで実行し、ブローカ管理コンソールのキューでメッセージを送信すると、メッセージの数を確認できますが、onMessage() が呼び出されるとすぐに、メッセージの数が 1 つ減ります。つまり、メッセージが消費され、キューから削除されます。そのメッセージは「配信済み」と見なされますか? 例外が発生したときにメッセージが再配信されない理由を理解してください。
前もって感謝します。