2015-05-17 7 views
8

मैं प्रकाशित: सदस्य बनने के लिए @JmsListener एनोटेशन के आधार पर उदाहरण बनाने के लिए कोशिश कर रहा हूँ: https://github.com/lkrnac/book-eiws-code-samples/tree/master/05-jms/0515-publish-subscribe@JmsListener उपयोग प्रकाशित: सदस्य बनने के विषय

प्रासंगिक कोड के टुकड़े:

@Slf4j 
@SpringBootApplication 
@EnableScheduling 
public class JmsPublishSubscribeApplication { 

    public static void main(String[] args) throws InterruptedException { 
     SpringApplication.run(JmsPublishSubscribeApplication.class, args); 
    } 

    @Bean 
    public ActiveMQTopic simpleTopic() { 
     return new ActiveMQTopic("simpleTopic"); 
    } 

} 

@Component 
public class SimpleMessageListener1 { 

    @JmsListener(destination = "simpleTopic") 
    public void readMessage(String message) { 
     //.... 
    } 

} 

@Component 
public class SimpleMessageListener2 { 

    @JmsListener(destination = "simpleTopic") 
    public void readMessage(String message) { 
     //.... 
    } 

} 

समस्या यह है कि इस मिल रहा है व्यवहार:

2015-05-17 20:07:04.985 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message 
2015-05-17 20:07:05.070 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 2 
2015-05-17 20:07:05.975 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message 
2015-05-17 20:07:05.986 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 1 
2015-05-17 20:07:06.975 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message 
2015-05-17 20:07:06.987 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 2 
2015-05-17 20:07:07.975 INFO 22983 --- [pool-1-thread-1] n.l.b.e.chapter05.SimpleMessageSender : Sending message: simple message 
2015-05-17 20:07:07.994 INFO 22983 --- [enerContainer-1] n.l.b.e.c.JmsPublishSubscribeApplication : Message Received: simple message via listener 1 

लेकिन प्रत्येक संदेश को श्रोताओं द्वारा विषयों की परिभाषा के द्वारा उपभोग किया जाना चाहिए। मैं क्या खो रहा हूँ?

+2

एक 'application.properties' जोड़ें और सेट' spring.jms:

@Bean public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); // This provides all boot's default to this factory, including the message converter configurer.configure(factory, connectionFactory); // You could still override some of Boot's default if necessary. factory.setPubSubDomain(true); return factory; } 

यह तो @JmsListener एनोटेट विधि में इस्तेमाल किया जा सकता .pub-sub-domain' 'true' पर। –

+0

पुष्टि कर सकता है कि यह ध्वज काम करता है। अजीब बात यह है कि जब आप इसे प्रोग्रामिक रूप से करते हैं तो यह काम नहीं करता है: jmsTemplate.setPubSubDomain (सत्य); – luboskrnac

+0

@ एम। डीनियम क्या आप कुछ अंक अर्जित करने के लिए उत्तर नहीं बनाना चाहते हैं? – luboskrnac

उत्तर

21

एक @JmsListener का उपयोग करते समय यह एक DefaultMessageListenerContainer जो JmsDestinationAccessor जो डिफ़ॉल्ट रूप से false करने के लिए pubSubDomain सेट है फैली उपयोग करता है। जब यह संपत्ति झूठी होती है तो यह कतार पर चल रही है। यदि आप विषयों का उपयोग करना चाहते हैं तो आपको यह गुण मान true पर सेट करना होगा।

आप Spring Boot उपयोग कर रहे हैं के रूप में आप काफी आसानी से application.properties को spring.jms.pub-sub-domain संपत्ति जोड़कर सच को यह गुण सेट और true के लिए सेट कर सकते हैं।

spring.jms.pub-sub-domain=true 

जब एक @JmsListener का उपयोग कर इसे एक jmsListenerContainerFactory नामित सेम की तलाश में है, अगर है कि उपलब्ध एक डिफ़ॉल्ट उसकी उम्मीद है नहीं है। आप अपनी खुद की बीन भी शामिल कर सकते हैं और प्रोग्रामेटिक रूप से इस प्रॉपर्टी को true सेट कर सकते हैं।

@Bean 
public DefaultMessageListenerContainer jmsListenerContainerFactory() { 
    DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer(); 
    dmlc.setPubSubDomain(true); 
    // Other configuration here 
    return dmlc; 
} 

बेशक यह भी काम करेगा लेकिन अधिक काम, इस बारे में अधिक जानकारी होगी @EnableJms annotation के प्रलेखन में पाया जा सकता है।

+0

अन्य गैर/अस्पष्ट संबंधित प्रश्नों को हाइजैक न करें, इसके बजाय एक नया प्रश्न पूछें। –

+0

आपकी मदद के लिए धन्यवाद। कृपया, कक्षा का नाम ठीक करें: आपने "डिफ़ॉल्ट" –

+0

के बजाय "डेफॉल्ट" लिखा है। आपके पास DefeaultMessageListenerContainer में एक टाइपो है और मैं इसे संपादित नहीं कर सकता ... – kabeen

4

Topic करने के लिए Queue से एक @JmsListener के डिफ़ॉल्ट गंतव्य प्रकार स्विचिंग गुण को संशोधित करने या एक्सएमएल का उपयोग किए बिना जावा में पूरी तरह से किया जा सकता है।

Spring guide में DefaultMessageListenerContainer द्वारा प्रदान की गई डिफ़ॉल्ट सेटिंग्स को अनुकूलित करने के लिए एक उदाहरण है।

यह एक कस्टम सेम को परिभाषित करने की आवश्यकता है इस प्रकार की तरह:

@JmsListener(destination = "mailbox", containerFactory = "myFactory") 
public void receiveMessage(Email email) { 
    // implementation 
} 
संबंधित मुद्दे