我们在weblogic10.3.4和JMS队列上设置,下面是消息监听器代码,它使用Spring JMS,MessageProducer设置为ClientAcknowledgeMode。当发生异常时,消息仍然移出队列并重新回滚,下面的代码有什么问题吗?
public class EmailListener implements MessageListener,ExceptionListener{
private EmailSend emailSend;
@SuppressWarnings("unchecked")
public void onMessage(Message message){
ObjectMessage om ;
try {
if(message instanceof ObjectMessage) {
om = (ObjectMessage)message;
emailSend.sendEmail((Map<String, String>)om.getObject());
//throw new JMSException("Test");
om.acknowledge();
}
}
catch(MailException me) {
logger.error("Mail server exception in sending email",me);
throw new RuntimeException(me);
}catch(JMSException jmse) {
logger.error("Error in sending email",jmse);
throw new RuntimeException(jmse);
}
}
public void setEmailSend(EmailSend emailSend){
this.emailSend = emailSend;
}
public void onException(JMSException jmse){
logger.error("Exception in sending email",jmse);
}
public void acknowledge(
) throws JMSException{
}
}
以下是Spring配置
<!--Spring JMS Message Listener Container -->
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:autoStartup="true" p:destination-ref="queue"
p:destinationResolver-ref="jmsDestinationResolver"
p:connectionFactory-ref="authenticationConnectionFactory"
p:exceptionListener-ref="emailListener"
p:messageListener-ref="emailListener" />
答案 0 :(得分:0)
你需要澄清一下。标题表示您的邮件不会按原样回滚到队列,而帖子中的文本表示邮件已回滚。
从未如此,有几个指针可以让你的回滚行为正确无误:
不要依赖确认。实际上,它们并不打算成为应用程序逻辑级别的重新传递。您可以阅读有关它的一些详细信息here。因此,acks不会让您在例外情况下重新获得,但交易将会。
您可以在DMLC上设置p:sessionTransacted =“true”。这可能就是你想要的 - 如果你得到一个例外,消息将被回滚到队列。
如果您开始在此包含数据库连接,您可能应该从WebLogic JNDI存储库中获取Jta事务管理器并将其作为p:transactionManager propery注入DMLC,因为会话事务仅支持一个资源事务。