I am trying to explicitly set deliveryMode to NONPERSISTENT and send it to ActiveMQ.
Here is my Spring JMS configuration:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.app" />
<!-- enable the configuration of jms on annotations -->
<jms:annotation-driven/>
<!-- =============================================== -->
<!-- JMS Common, Define JMS connectionFactory -->
<!-- =============================================== -->
<!-- Activemq connection factory -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- brokerURL, You may have different IP or port -->
<constructor-arg index="0" value="tcp://localhost:61616" />
</bean>
<!-- Pooled Spring connection factory -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
</bean>
<!-- ======================================================= -->
<!-- JMS Send, define default destination and JmsTemplate -->
<!-- ======================================================= -->
<!-- Default Destination Queue Definition -->
<bean id="defaultDestination" class="org.apache.activemq.command.ActiveMQQueue">
<!-- name of the queue -->
<constructor-arg index="0" value="Send2Recv" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="defaultDestination" />
<property name="deliveryPersistent" value="false"/>
<property name="deliveryMode" value="1"/>
<property name="timeToLive" value="10000"/>
</bean>
<!-- =============================================== -->
<!-- JMS receive, define JmsListenerContainerFactory -->
<!-- =============================================== -->
<bean id="jmsListenerContainerFactory"
class="org.springframework.jms.config.DefaultJmsListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory" />
<property name="concurrency" value="3-10"/>
</bean>
</beans>
And my producer:
@Component
public class JmsMessageSender {
private final Logger log = Logger.getLogger(JmsMessageSender.class.toString());
@Autowired
private JmsTemplate jmsTemplate;
public void send(final Destination dest, final String text) {
this.jmsTemplate.send(dest, session -> {
Message message = session.createTextMessage(text);
log.info("delivery mode {" + jmsTemplate.getDeliveryMode() + "}, timeToLive {" + jmsTemplate.getTimeToLive() + "}");
return message;
});
}
}
While sending I see in my console log:
INFO: Established shared JMS Connection: ActiveMQConnection {id=ID:localhost-61129-1458640452010-1:1,clientId=null,started=false}
mar 22, 2016 10:54:12 AM com.app.JmsMessageSender lambda$send$1
INFO: delivery mode {1}, timeToLive {10000}
mar 22, 2016 10:54:12 AM com.app.JmsMessageSender lambda$send$1
INFO: delivery mode {1}, timeToLive {10000}
which means delivery mode is set as NONPERSISTENT. However, when I open ActiveMQ WebConsole - there are messages marked as Persistent.
Can someone explain me, why? How to fix this?

See the documentation - you have to enable QOS settings (such as persistence) by setting explicitQosEnabled to true.
This is also mentioned in the javadoc for setDeliveryPersistent.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With