요구 사항 :onMessage()
이 성공적으로 실행될 때까지 메시지가 대기열에 남아 있기를 원합니다. onMessage()
실행 중에 예외가 발생하고 처리되지 않으면 메시지가 리스너에게 다시 전달되어야합니다.onMessage()가 호출되면 JMS 비동기 메시지 처리에서 메시지가 큐에서 삭제됩니다.
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
공공 무효 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");
}
SampleJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
throw new RuntimeException();
}
}
다음
내가 this.jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
로와 청취자의 I에 노력 message.acknowledge();
그리고 블록에서 나는 여전히 session.recover()
라고 불리는 메시지가 재전송되지 않습니다.
SampleJMSConsumer.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 씩 줄어 듭니다. 이는 메시지가 대기열에서 사용되고 삭제됨을 의미합니다. 그 메시지는 "배달 된"것으로 간주됩니까? 예외가 발생했을 때 메시지가 재전송되지 않는 이유를 이해하도록 도와주십시오.
미리 감사드립니다.
안녕하세요 Ashwini. 나는 비슷한 것을하려고 노력하고있다. JMSTemplate을 사용하여 메시지를 보내고 Listener는 DefaultMessageListenerContainer에 의해 시작됩니다. 내 문제는 복구 할 onMessage 메서드에 세션 개체가 없습니다. 위 코드에서 세션 객체를 Listner에 어떻게 전달합니까? –