java - Spring / WebLogic - JMS message not redelivered on failure -
i using werblogic 10.3.5 , spring 3.0 implement jms queue. have next spring configuration:
<!-- jms configuration --> <bean id="paymentlistener" class="com.myproject.service.impl.paymentlistener"/> <bean id="paymentlistenercontainer" class="org.springframework.jms.listener.defaultmessagelistenercontainer"> <property name="concurrentconsumers" value="10"/> <property name="connectionfactory" ref="paymentconnectionfactory"/> <property name="destination" ref="paymentqueue"/> <property name="messagelistener" ref="paymentlistener"/> </bean> <bean id="paymentqueue" class="org.springframework.jndi.jndiobjectfactorybean"> <property name="jndiname" value="jms/paymentresponsehandlerqueue"/> <property name="jnditemplate" ref="jnditemplate"/> </bean> <bean id="jnditemplate" class="org.springframework.jndi.jnditemplate"> <property name="environment"> <props> <prop key="java.naming.factory.initial">weblogic.jndi.wlinitialcontextfactory</prop> <prop key="java.naming.provider.url">t3://localhost:7001</prop> </props> </property> </bean> <bean id="paymentconnectionfactory" class="org.springframework.jndi.jndiobjectfactorybean"> <property name="jnditemplate" ref="jnditemplate"/> <property name="jndiname" value="jms/paymentresponsehandlerconnectionfactory"/> </bean> <bean id="jmsdestinationresolver" class="org.springframework.jms.support.destination.jndidestinationresolver"> <property name="jnditemplate" ref="jnditemplate"/> <property name="cache" value="true"/> </bean> <bean id="jmstemplate" class="org.springframework.jms.core.jmstemplate"> <property name="connectionfactory" ref="paymentconnectionfactory"/> <property name="destinationresolver" ref="jmsdestinationresolver"/> <property name="defaultdestination" ref="paymentqueue"/> <property name="sessionacknowledgemodename" value="dups_ok_acknowledge"/> <property name="sessiontransacted" value="true"/> </bean>
my message creation code looks this:
messagecreator messagecreator = new messagecreator() { public message createmessage(session session) throws jmsexception { logger.debug("session ack mode: " + session.getacknowledgemode()); homecoming session.createobjectmessage(payment); } }; jmstemplate.send("jms/paymentresponsehandlerqueue", messagecreator);
and listener looks this:
@override public void onmessage(message message) { // , session session if (!(message instanceof objectmessage)) { throw new illegalstateexception("the paymentlistener queue expects object message"); } objectmessage objectmessage = (objectmessage) message; seek { logger.debug("is message redelivered:" + objectmessage.getjmsredelivered ()); if (objectmessage.getobject() instanceof creditcardpaymentdto) { logger.debug("object of type creditcardpaymentdto"); // user logged in creditcardpaymentdto payment = (creditcardpaymentdto) objectmessage.getobject(); otpcollectordao.savepayment(payment); } } grab (jmsexception e) { logger.error(e); throw new runtimeexception(e); } grab (paymentresponseexception e) { logger.error(e); throw new runtimeexception(e); } }
the message beingness created correctly, , onmessage() method of listener beingness called, if logic fails , throw runtimeexception(), message not redelivered. i've tried many slight variations of above code (eg. setting sessionacknowledgemodename=session_transacted , explicitly rolling transaction), message never re-queued. trick getting failed messages redeliver?
i believe need set sessiontransacted
true
defaultmessagelistenercontainer
:
<bean id="paymentlistenercontainer" class="org.springframework.jms.listener.defaultmessagelistenercontainer"> ... <property name="sessiontransacted" value="true"/> </bean>
you can find here relevant reference documentation.
java jms weblogic spring-3
No comments:
Post a Comment