2017-02-22 49 views
0

Я использую последние Spring 4 и ActiveMQ для размещения JMS-сообщений в очереди. Используя JMSTemplate, у меня есть очередь по умолчанию, и пример кода, который я имею, позволяет мне помещать сообщение в очередь по умолчанию без проблем. Существует также пример кода, который позволяет мне помещать сообщение в пункт назначения ... вот где я повесил трубку.Spring и JMS DynamicDestinationResolution

оригинальный метод:

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

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

Вот что я хотел:

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

Если очередь или тема существует, возвращает этот пункт назначения, в противном случае возвращают нуль.

Нам не нужны временные очереди или темы, и мы не создаем новые очереди или темы на лету. Мы также не используем JNDI в этом приложении Spring. Мы используем инструмент администрирования ActiveMQ для создания наших тем или очередей.

Итак, я искал пример такого метода, как я описал. Я прочесывал сеть, прежде чем приехал сюда, и сначала посмотрел на нее, прежде чем я разместил этот вопрос. Если кто-то может передать мне какую-то документацию или сайт, на котором есть фрагмент кода для этого, это было бы здорово.

Спасибо за помощь!

ответ

0

Оказывается, мне ничего не нужно было делать. Вот как мой ActiveMQ определяется в файле контекста XML:

<!-- =============================================== --> 
<!-- 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> 

Когда я смотрел на различные методы под «jmsTemplate» Я не понимал, что был метод с Последовательностью Пошлите для имени адресата. Я знал, что в качестве первого параметра был метод отправки с Destination. Таким образом, проблем не было. Этот метод работает отлично.

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

Надеюсь, что это поможет кому-то.