2016-03-22 10 views
4

Ich versuche explizit DeliveryMode auf NONPERSISTENT zu setzen und es an ActiveMQ zu senden.ActiveMQ mit Spring JMS - wie NONPERSISTENT Nachricht gesendet wird?

Hier ist mein Frühling JMS-Konfiguration:

<?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> 

Und mein Produzent:

@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; 
     }); 
    } 
} 

Während des Sende ich in meinem Konsolenprotokoll sehen:

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} 

die Abgabemodus Mittel als NICHTPERSISTENT festgelegt. Wenn ich jedoch ActiveMQ WebConsole öffne - gibt es Nachrichten, die als Persistent markiert sind.

Kann mir jemand erklären, warum? Wie behebe ich das?

enter image description here

Antwort

3

Siehe the documentation - Sie QOS Einstellungen (wie Persistenz) zu ermöglichen, haben durch explicitQosEnabled auf true setzen.

Dies wird auch in der Javadoc für setDeliveryPersistent erwähnt.

+0

Das hat mir wirklich geholfen! Aus der Dokumentation: 'Einige JMS-Provider erlauben die administrative Einstellung von Standard-QOS-Werten durch die Konfiguration der ConnectionFactory. Dies hat zur Folge, dass ein Aufruf von MessageProducers send-Methode send (Destination destination, Message message) andere QOS-Defaultwerte als die in der JMS-Spezifikation angegebenen verwendet. Um eine konsistente Verwaltung von QOS-Werten zu ermöglichen, muss das JmsTemplate daher speziell aktiviert werden, um seine eigenen QOS-Werte zu verwenden, indem die boolesche Eigenschaft isExplicitQosEnabled auf true gesetzt wird – mlewandowski

Verwandte Themen