Weblogic サーバーの外部 JMS サーバーとして MQ を使用しています。問題は、メッセージをロールバックして、バックアウトのしきい値に達するまで再試行する必要があることです。次に、メッセージをバックアウト キューに移動する必要があります。
MessageDrivenContext.setRollbackOnly() メソッドがそれを適切に処理します。ただし、問題はバックアウト キューのメッセージにあります。メッセージはコミットされていません。
さらに、メッセージはバックアウト キューから取得され、新しいメッセージがメイン キューに表示されるとすぐに再度処理されます。
これは、私のアプローチに何かひどく問題があることを示唆しています。ただし、同じメッセージで onMessage() を数回再試行し、それをバックアウト キューに送信する必要があるという事実を変更することはできません。
@MessageDriven( name="MQListener", mappedName = "jms.mq.SOME.QUEUE.NAME",
activationConfig =
{
@ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "jms.mq.SOME.QUEUE.NAME"),
@ActivationConfigProperty(propertyName = "connectionFactoryJndiName", propertyValue = "jms.mq.MQ"),
@ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true")
})
public class MQListener implements MessageListener {
@Resource
private MessageDrivenContext context;
@Override
public void onMessage(Message message) {
String messageContent="";
try {
messageId = message.getJMSMessageID();
if (message != null) {
messageContent = ((TextMessage)message).getText();
if(!doSomething(messageContent)){
// doSomething fails, I need to rollback the message and try again:
context.setRollbackOnly();
}
}
} catch (Exception e) {
throw new RuntimeException();
}
}
private boolean doSomething(String messageContent){
// ...
}
}