2017-02-22 4 views
0

Ich verwende die neuesten Spring 4 und ActiveMQ, um JMS-Nachrichten in eine Warteschlange zu stellen. Unter Verwendung der JMSTemplate habe ich eine Standardwarteschlange, und der Beispielcode, den ich habe, lässt mich eine Nachricht ohne Probleme in die Standardwarteschlange schreiben. Es gibt auch einen Beispielcode, mit dem ich eine Nachricht auf ein Ziel setzen kann ... hier bin ich aufgelegt.Spring und JMS DynamicDestinationResolution

ursprüngliche Methode:

public void send(final Destination dest,final String text) { 

this.jmsTemplate.send(dest,new MessageCreator() { 
    @Override 
    public Message createMessage(Session session) throws JMSException { 
    Message message = session.createTextMessage(text); 
    return message; 
    } 
}); 
} 

Wenn ich ein Ziel habe, kann ich das in geben und es sollte funktionieren, aber ich habe es noch nicht ausprobiert. Was ich wirklich tun möchte, ist eine Zeichenfolge für einen Namen oder ein Thema zu übergeben.

Hier ist, was Ich mag würde:

public void send(final String destination,final String text) { 

    Destination dest = getDestinationFromString(destination); 

    if(dest != null) { 

    this.jmsTemplate.send(dest,new MessageCreator() { 
    @Override 
     public Message createMessage(Session session) throws JMSException { 
     Message message = session.createTextMessage(text); 
     return message; 
     } 
    }); 
    } 
} 

Wenn die Warteschlange oder ein Thema vorhanden ist, bringe diese Destination, andernfalls null zurück.

Wir möchten keine temporären Warteschlangen oder Themen, und wir erstellen keine neuen Warteschlangen oder Themen im laufenden Betrieb. Wir verwenden JNDI auch nicht innerhalb dieser Spring-Anwendung. Wir verwenden das ActiveMQ-Web-Admin-Tool, um unsere Themen oder Warteschlangen zu erstellen.

Also suchte ich nach einem Beispiel für eine Methode wie ich beschrieben habe. Ich habe das Netz durchforstet, bevor ich hierher kam, und ich habe zuerst nachgesehen, bevor ich diese Frage gestellt habe. Wenn mir jemand eine Dokumentation oder eine Website mit einem Code-Snippet empfehlen kann, wäre das großartig.

Danke für die Hilfe!

Antwort

0

Es stellte sich heraus, dass ich nichts tun musste. Hier ist, wie mein activemq im Kontext XML-Datei definiert:

<!-- =============================================== --> 
<!-- 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="${message.broker.url}" /> 
</bean> 

<!-- Pooled Spring connection factory --> 
<bean id="jmsConnectionFactory" 
    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="${default.message.queue}" /> 
</bean> 

<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver"/> 

<!-- JmsTemplate Definition --> 
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
    <property name="defaultDestination" ref="defaultDestination" /> 
    <property name="destinationResolver" ref="jmsDestinationResolver"/> 
    <property name="pubSubDomain" value="${pub.sub.domain}"/> 
    <property name="receiveTimeout" value="${receive.timeout}"/> 
</bean> 

Als ich bei den verschiedenen Methoden unter ‚jmsTemplate‘ mir auf der Suche war nicht klar, da eine .send Methode mit String für einen Zielnamen war. Ich wusste, dass es eine Send-Methode mit Ziel als ersten Parameter gab. Also, es gab wirklich kein Problem. Diese Methode funktioniert einwandfrei.

public void sendToDestination(final String destination, final MyObjectDTO myObject) throws JMSException { 
    this.jmsTemplate.send(destination, new MessageCreator() { 
     @Override 
     public Message createMessage(Session session) throws JMSException { 
      Message message = session.createObjectMessage(myObject); 
      return message; 
     } 
    }); 
    return success; 
} 

Hoffe, das hilft jemand aus.

Verwandte Themen