2010-08-19 19 views
12

Başka bir sistem tarafından işlenecek bir sıraya ileti gönderen bir bileşenim var. Ayrıca, her zaman bir arada iş durumları hakkında bir konu yayımlamalıdır. Sadece bir sıraya göndermek ve bir konuya yayınlamak için kullanılan aynı JmsTemplate kullanabilir miyim?Spring JMS ile JMS konusunu nasıl yayınlıyorsunuz?

JMSTemplate'ten bir ileti gönderdiğimde, gönderilen iletiyle (gerçek konuyu veri göndermek yerine) konu adı ile yeni bir sıra oluşturulduğu dışında ActiveMQ'da yeni bir konu oluşturdum. Burada yanlış mı yapıyorsun?

<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <constructor-arg ref="amqConnectionFactory" /> 
    <property name="exceptionListener" ref="jmsExceptionListener" /> 
    <property name="sessionCacheSize" value="100" /> 
</bean> 

<!-- JmsTemplate Definition --> 
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <constructor-arg ref="connectionFactory" /> 
</bean> 


<bean id="messageFacade" class="org.foo.MessageFacadeJms"> 
    <property name="jmsTemplate" ref="jmsTemplate" /> 
</bean> 

MessageFacadeJms ben, (ve o inşaat) bir kuyruk mesaj göndermek için kullanmak sınıfı ben de sadece bir konuyu yayınlamak için kullandık edebilirsiniz edilir:

burada benim yapılandırma var?

Sadece, bunu bir konu belirleyerek, bir kuyrukta ziyade olduğunu JmsTemplate söylememe gerek gönderen ve konu yayıncılık ?:

jmsTemplate.convertAndSend("TOPIC_NAME" /* or queue name */, message); 

cevap

28

Bu biraz tuhaf görünebilir hem kuyruğunu yapmak için kullanabilir miyim onun pubSubDomain özelliği, true. Bir bahar fasulyesi olarak hedef oluşturursanız

<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <constructor-arg ref="connectionFactory" /> 
    <property name="pubSubDomain" value="false"/> 
</bean> 

<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <constructor-arg ref="connectionFactory" /> 
    <property name="pubSubDomain" value="true"/> 
</bean> 
5

ziyade hedef adını kullanarak: İki JmsTemplate fasulye, kuyrukta için bir tane ve konu için bir tane ihtiyacımız olacak demektir

Kodunuz, Spring'in bir konu veya sıra olup olmadığını bilmesi gerekmeyecek. Daha önce önerilen çözüm de işe yaramalı.

AMQ JMS yerler doğrudan örneklendirerek oluşturulabilir:

<bean id="destination" class="org.apache.activemq.command.ActiveMQTopic"> 
    <constructor-arg value="TOPIC_NAME" /> 
    </bean> 

veya JNDI gelen getirilirken: Bu daha standart olduğu gibi

<bean id="topic" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="TOPIC_NAME"/> 
     <property name="jndiTemplate" ref="jmsJndiTemplate"/> 
</bean> 

Ben Jndi tekniğini tercih ederim. Eğer kuyruk/konular için bir adlandırma kuralı kullanmak için tamam değilse

1

, o zaman özel bir org.springframework.jms.support.destination.DestinationResolver

public class NamingDestinationResolver implements DestinationResolver { 
    public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException { 
     if (destinationName.endsWith("Queue")) { 
     return session.createQueue(destinationName); 
     } else if (destinationName.endsWith("Topic")) { 
     return session.createTopic(destinationName); 
     } 
     throw new RuntimeException("Naming convention not respected for destination " + destinationName); 
    } 
} 

uygulamak ve

+0

JmsTemplate.setDestinationResolver benim için mükemmel çalıştı kullanarak başvurabilirsiniz. Hedef Çözümüne @Component eklerseniz, cevabı faydalı bulursanız, JmsTemplate – danielnovy

+0

@danielnovy'ye ayarlamanıza bile gerek yoktur, bir oylama takdir edilecektir :) –