2016-04-27 5 views
0

Ich benutze MQ in meinem Projekt über SpringJMS, als Broker verwende ich ActiveMQ. Ich brauche Ablauf meldungsbasierte einzustellen, also versuchte ich message.setJMSExpiration aber ohne Erfolg verwendet. Alle Nachrichten, die zu ActiveMQ kommen, haben Ablauf = 0.Set Ablauf pro Nachricht mit SpringJMS

Hat jemand Erfolg hat Expiration pro Nachricht mit der Einstellung Frühling mit?

Zur Konfiguration JmsTemplate I Standardwert verwenden explicitQosEnabled = false; so erwartete ich Ablauf von meiner Botschaft Requisiten zu halten. Aber wie ich in ActiveMQSession.class sehe diese Nachricht Eigenschaften werden überschrieben:

Was mache ich falsch? oder es ist einfach unmöglich mit diesem Werkzeug.

Antwort

0

JMSExpiration ist nicht der Weg, um einen Ablauf zu setzen. Siehe die Javadocs für Message ...

JMS-Anbieter legen dieses Feld fest, wenn eine Nachricht gesendet wird. Diese Methode kann verwendet werden, um den Wert für eine Nachricht zu ändern, die empfangen wurde.

Mit anderen Worten, es wird auf einem Sende ignoriert - die Zeit zu leben ist auf der producer.send()-Methode festgelegt.

Zum Ablauf einer Meldung explicitQosEnabled auf true und setTimeToLive(...).

+0

Danke, ich diesen Punkt verpasst, kann ich 'explicitQosEnabled' auf' true' gesetzt, sondern ist producer.send() Funktion mit ttl in Parameter für mich über JmsTemplate nicht zur Verfügung. – iMysak

+0

Nein, Sie haben die TTL auf der Vorlage festgelegt. Wenn explizite QOS aktiviert ist, wird die Vorlage die TTL für den Sendevorgang festlegen. [Siehe hier] (https://github.com/spring-projects/spring-framework/blob/master/spring-jms/src/main/java/org/springframework/jms/core/JmsTemplate.java#L622). –

+0

yep, das ist ziemlich klar, aber in diesem Fall kann ich nicht unterschiedliche Ablauf für verschiedene Nachrichten verwenden, wie ich brauche. Ich kann es nicht im gleichzeitigen Modus verwenden. – iMysak

1

Ich weiß nicht, warum Frühling dies auszuschließen entschieden, aber Sie können JmsTemplate erweitern und einige Methoden überlasten, ein timeToLive Argument übergeben.

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

}