2016-04-27 2 views
0

Я использую MQ в своем проекте через SpringJMS, в качестве брокера использую ActiveMQ. Мне нужно установить expiration на основе сообщений, поэтому я попытался использовать message.setJMSExpiration, но безуспешно. Все сообщения, поступающие в ActiveMQ, имеют expiration = 0.Установить истечение за сообщение с SpringJMS

У кого-нибудь есть успех с установкой истечения срока действия на сообщение с использованием Spring?

Для настройки JmsTemplate я использовал значение по умолчанию explicitQosEnabled = false;, поэтому я ожидал, что вы останетесь с моим реквизитом Message. Но, как я вижу в ActiveMQSession.class это свойство сообщения будет переопределение:

 long expiration = 0L; 
     if (!producer.getDisableMessageTimestamp()) { 
      long timeStamp = System.currentTimeMillis(); 
      message.setJMSTimestamp(timeStamp); 
      if (timeToLive > 0) { 
       expiration = timeToLive + timeStamp; 
      } 
     } 
     message.setJMSExpiration(expiration); 
     //me: timeToLive coming from default values of Producer/JmsTemplate... 

Что я делаю неправильно? или это невозможно с помощью этих инструментов.

ответ

0

JMSExpiration не является способ установить срок годности. См. Javadocs для Message ...

Поставщики JMS устанавливают это поле при отправке сообщения. Этот метод можно использовать для изменения значения для полученного сообщения.

Другими словами, его игнорируют при отправке - время жизни устанавливается по методу producer.send().

Срок истечения срока действия сообщения explicitQosEnabled - true и setTimeToLive(...).

+0

Спасибо, пропустите этот момент, я могу установить '' explicitQosEnabled' к true', но функция, producer.send() с ТТЛ в параметрах не доступны для меня через JmsTemplate. – iMysak

+0

Нет, вы установили TTL на шаблон; то, когда включена явная QOS, шаблон будет устанавливать TTL на отправке. [См. Здесь] (https://github.com/spring-projects/spring-framework/blob/master/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate.java#L622). –

+0

yep, это довольно ясно, но в этом случае я не могу использовать различное истечение для разных сообщений, как мне нужно. Я не могу использовать его в параллельном режиме. – iMysak

1

Я не знаю, почему Spring решила исключить это, но вы можете расширить JmsTemplate и перегрузить некоторые методы, передав аргумент timeToLive.

public class MyJmsTemplate extends JmsTemplate { 

    public void send(final Destination destination, 
      final MessageCreator messageCreator, final long timeToLive) 
      throws JmsException { 
     execute(new SessionCallback<Object>() { 
      public Object doInJms(Session session) throws JMSException { 
       doSend(session, destination, messageCreator, timeToLive); 
       return null; 
      } 
     }, false); 
    } 

    protected void doSend(Session session, Destination destination, 
      MessageCreator messageCreator, long timeToLive) throws JMSException { 

     Assert.notNull(messageCreator, "MessageCreator must not be null"); 
     MessageProducer producer = createProducer(session, destination); 
     try { 
      Message message = messageCreator.createMessage(session); 
      if (logger.isDebugEnabled()) { 
       logger.debug("Sending created message: " + message); 
      } 
      doSend(producer, message, timeToLive); 
      // Check commit - avoid commit call within a JTA transaction. 
      if (session.getTransacted() && isSessionLocallyTransacted(session)) { 
       // Transacted session created by this template -> commit. 
       JmsUtils.commitIfNecessary(session); 
      } 
     } finally { 
      JmsUtils.closeMessageProducer(producer); 
     } 
    } 

    protected void doSend(MessageProducer producer, Message message, 
      long timeToLive) throws JMSException { 
     if (isExplicitQosEnabled() && timeToLive > 0) { 
      producer.send(message, getDeliveryMode(), getPriority(), timeToLive); 
     } else { 
      producer.send(message); 
     } 
    } 

} 
Смежные вопросы