2016-03-22 17 views
4

TeslimatMode'u açıkça NONPERSISTENT olarak ayarlamaya ve ActiveMQ'ya göndermeye çalışıyorum.Spring JMS'li ActiveMQ - nasıl HABERLEŞME iletisi gönderilir?

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

Ve yapımcı:

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

benim konsol günlüğüne bakın gönderirken:

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} 

teslimat modudur anlamına gelir Burada

benim Bahar JMS yapılandırma NONPERSISTENT olarak ayarlayın. Ancak, ActiveMQ WebConsole'u açtığımda - Kalıcı olarak işaretlenmiş iletiler var.

Birisi bana nedenini açıklayabilir mi? Bunu nasıl düzeltebilirim?

enter image description here

cevap

3

the documentation görün - true olarak explicitQosEnabled ayarlayarak (örneğin kalıcılık gibi) QoS ayarları etkinleştirmek gerekiyor.

Bu, javadoc'ta setDeliveryPersistent için de belirtilmiştir.

+0

Bu gerçekten bana yardımcı oldu! Dokümanlardan: 'Bazı JMS sağlayıcıları, ConnectionFactory yapılandırması aracılığıyla varsayılan QOS değerlerinin idari olarak ayarlanmasını sağlar. Bu, MessageProducer'ın gönderme yöntemine yapılan bir çağrının (Hedef varış yeri, İleti iletisi) JMS belirtiminde belirtilen değerlerden farklı QOS varsayılan değerler kullanması sonucunu doğurur. QOS değerlerinin tutarlı bir şekilde yönetilmesini sağlamak için, JmsTemplate, boolean özelliğini isExplicitQosEnabled true olarak ayarlayarak kendi QOS değerlerini kullanması için özel olarak etkinleştirilmelidir. – mlewandowski

İlgili konular