gpt4 book ai didi

glassfish - glassfish 上的 spring defaultmessagelistener 容器在异常后重新传递的正确设置是什么?

转载 作者:行者123 更新时间:2023-12-04 19:39:49 26 4
gpt4 key购买 nike

我正在尝试设置 spring 的 DefaultMessageListenerContainer 类以在抛出异常或调用 session.rollback() 后重新传递消息。我也试图让它在 glassfish 3.1.2 网络配置文件上运行。

在我的 SessionAwareMessageListener 的 onMessage() 方法中调用 session.rollback() 时,我收到一条异常消息:MessageDispatcher - [C4024]: The session is not transacted. 我不ActiveMQ 没有看到这个问题,但是当然配置是不同的,因为我没有在应用程序服务器中使用它。

这里有人搞定了吗?我的配置如下:

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">com.sun.enterprise.naming.SerialInitContextFactory</prop>
<prop key="java.naming.provider.url">${jms.jndicontext.url}</prop>
<prop key="java.naming.factory.state">com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl</prop>
<prop key="java.naming.factory.url.pkgs">com.sun.enterprise.naming</prop>
</props>
</property>
</bean>

<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="${jms.connection.factory}" />
</bean>

<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="defaultDestination" ref="jmsServiceQueue"/>
</bean>

<bean id="jmsServiceProducer"
class="net.exchangesolutions.services.messaging.service.jms.JmsMessageServiceProducerImpl">
<property name="serviceTemplate" ref="jmsTemplate"/>
<property name="serviceDestination" ref="jmsServiceQueue"/>
</bean>

<bean id="myMessageListener"
class="com.myorg.jms.MessageDispatcher"/>


<bean id="jmsServiceContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
<property name="destination" ref="jmsServiceQueue"/>
<property name="messageListener" ref="myMessageListener"/>
<property name="errorHandler" ref="jmsErrorHandler" />
<property name="receiveTimeout" value="180000"/>
<property name="concurrentConsumers" value="1"/>
<property name="cacheLevelName" value="CACHE_NONE"/>
<property name="pubSubNoLocal" value="true"/>
<property name="sessionTransacted" value="true"/>
<property name="sessionAcknowledgeMode" value="2" />
<property name="transactionManager" ref="jmsTransactionManager"/>
</bean>

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>

最佳答案

设置acknowledge="auto",消息在监听器执行之前被确认,所以消息从队列中删除。

我还通过对您的代码进行以下更改,在 Spring Application 中实现了 DLQ 场景。

首先,我们设置 acknowledge="transacted"(因为我们希望在抛出异常的情况下保证重新传递,并为成功的监听器执行发送确认)

<jms:listener-container container-type="default" connection-factory="connectionFactory" acknowledge=" transacted">

接下来,因为我们想抛出 JMSException,所以我们正在实现 SessionAwareMessageListener

public class MyMessageQueueListener implements SessionAwareMessageListener {
public void onMessage( Message message , Session session ) throws JMSException {
//DO something
if(success){
//Do nothing – so the transaction acknowledged
} else {
//throw exception - So it redelivers
throw new JMSException("..exception");
}
}
}

我已经测试过了。这似乎工作正常。

关于glassfish - glassfish 上的 spring defaultmessagelistener 容器在异常后重新传递的正确设置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12711472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com