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