Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ActiveMQ with Spring JMS - how to sent NONPERSISTENT message?

Tags:

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?

enter image description here

like image 921
mlewandowski Avatar asked Mar 22 '16 10:03

mlewandowski


1 Answers

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.

like image 99
Gary Russell Avatar answered Oct 12 '22 10:10

Gary Russell