Topic messages are not sent when using transacted JmsTemplate in 'TransactionSynchronization.afterCommit' phase [SPR-16270] #20817
Labels
in: data
Issues in data modules (jdbc, orm, oxm, tx)
in: messaging
Issues in messaging modules (jms, messaging)
type: bug
A general bug
Milestone
ofer baranes opened SPR-16270 and commented
On the following scenario, an attempt to send message to a TOPIC using JmsTemplate is not effective (the message is never sent and there is no error):
The expectation is that the message would be send and the subscriber would handle it.
On real, the message is never handled by the subscriber. The reason is that the message wasn't truly send.
Other observations:
The expectation is fulfilled and the subscriber gets the message if:
a) Using 'afterCompletion' instead of 'afterCommit',
b) Using none transacted JmsTemplate (on the 'afterCommit')
It appears that Spring determines the existence of an ongoing transaction by checking state
_TransactionSynchronizationManager
public static boolean isSynchronizationActive() {
return synchronizations.get() != null;
}
_
Since the 'synchronizations' thread local is not cleared when executing the 'afterCommit' callback, Spring mistakenly assumes that there is ongoing transaction and hence bounds the JMS operation to the ongoing transaction (instead of commiting it immediately) and since there is no ongoing transaction the JMS operation would never be committed.
(When using 'afterCompletion' it works since the 'synchronizations' thread local was cleared)
Affects: 4.3.11
Issue Links:
The text was updated successfully, but these errors were encountered: