You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Andrei Shakirin (JIRA)" <ji...@apache.org> on 2014/05/27 19:46:03 UTC
[jira] [Assigned] (CXF-5769) JMS message redelivery in CXF 2.7.X
[ https://issues.apache.org/jira/browse/CXF-5769?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrei Shakirin reassigned CXF-5769:
------------------------------------
Assignee: Andrei Shakirin
> JMS message redelivery in CXF 2.7.X
> -----------------------------------
>
> Key: CXF-5769
> URL: https://issues.apache.org/jira/browse/CXF-5769
> Project: CXF
> Issue Type: Improvement
> Components: Transports
> Affects Versions: 2.7.11
> Reporter: Andrei Shakirin
> Assignee: Andrei Shakirin
>
> I am trying to get working the JMS message redelivery in CXF 2.7.X.
> Use case: CXF client sends JMS message to the service one-way operation. Business implementation of oneWay method throws runtime exception.
> Expected: message will be redelivered according RedeliveryPolicy and finally placed in dead queue, if all attempts are failed.
> In CXF 3.0.0 this works out of the box, it is enough to set sessionTransacted property of the JMSListener (via JMSConfiguration) to true.
> In CXF 2.7.X the problem is that JMSDestination onMessage() method (is JMS listener) doesn't throw exception, because of the following check:
> {code}
> //need to propagate any exceptions back to Spring container
> //so transactions can occur
> if (inMessage.getContent(Exception.class) != null && session != null) {
> PlatformTransactionManager m = jmsConfig.getTransactionManager();
> if (m != null) {
> TransactionStatus status = m.getTransaction(null);
> JmsResourceHolder resourceHolder =
> (JmsResourceHolder) TransactionSynchronizationManager
> .getResource(jmsConfig.getConnectionFactory());
> boolean trans = resourceHolder == null
> || !resourceHolder.containsSession(session);
> if (status != null && !status.isCompleted() && trans) {
> Exception ex = inMessage.getContent(Exception.class);
> if (ex.getCause() instanceof RuntimeException) {
> throw (RuntimeException)ex.getCause();
> } else {
> throw new RuntimeException(ex);
> }
> }
> }
> }
> {code}
> resourceHolder.containsSession(session) always finds session and returns true => exception is never thrown from onMessage => message will not be redelivered.
> The sessionTransacted is set to true and spring transaction manager JmsTransactionManager is configured in JMSConfiguration.
--
This message was sent by Atlassian JIRA
(v6.2#6252)