복붙노트

[SPRING] 스프링 부트 jms를 사용하여 주제를 듣는 법

SPRING

스프링 부트 jms를 사용하여 주제를 듣는 법

아래의 스 니펫을 사용하여 주제를 듣고 있습니다. 그러나 대기열을 기본적으로 청취합니다. 이 경우에는 xml 구성이 없습니다. 나는 주석에 전적으로 의존하고있다. 게다가 나는 스프링 부트에 의해 제공된 자동 설정에 완전히 의존했다. 주제 유형으로 대상 유형을 설정하는 방법은 JmsListener에서 확실하지 않습니다. Spring JMS 전문가가 도와주세요.

    @Component
    public class MyTopicListener {

        @JmsListener(destination = "${trans.alert.topic}")
        public void receiveMessage(TransactionAlert alert) {
            logger.info("AlertSubscriberEmail :: Sending Email => <" + alert + ">");
        }
    }

해결법

  1. ==============================

    1.방금 Spring 부트 예제를 https://github.com/spring-guides/gs-messaging-jms/에서 가져 왔습니다.

    방금 Spring 부트 예제를 https://github.com/spring-guides/gs-messaging-jms/에서 가져 왔습니다.

    이것은 큐에서 메시지를 보내고 받기 위해 만들어집니다. 이것을 주제로 변경하려면 Factory 인스턴스에서 Pub-Sub 속성을 설정해야합니다.

    import org.springframework.beans.factory.support.BeanDefinitionBuilder;
    import org.springframework.beans.factory.support.DefaultListableBeanFactory;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
    import org.springframework.context.ConfigurableApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.jms.annotation.EnableJms;
    import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
    import org.springframework.jms.config.JmsListenerContainerFactory;
    import org.springframework.jms.connection.CachingConnectionFactory;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
    import org.springframework.jms.support.converter.MessageConverter;
    import org.springframework.jms.support.converter.MessageType;
    
    import javax.jms.ConnectionFactory;
    
    @SpringBootApplication
    @EnableJms
    public class JmsSampleApplication {
    
    public void registerBeans(ConfigurableApplicationContext context ){
        BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(JmsTemplate.class);
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
    
        builder.addPropertyValue("connectionFactory", cachingConnectionFactory);      // set property value
        DefaultListableBeanFactory factory = (DefaultListableBeanFactory) context.getAutowireCapableBeanFactory();
        factory.registerBeanDefinition("jmsTemplateName", builder.getBeanDefinition());
    }
    
    @Bean
    public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setPubSubDomain(true);
        // 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.
        return factory;
    }
    
    @Bean
    public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory,
                                                               DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        //factory.setPubSubDomain(true);
        // This provides all boot's default to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        return factory;
    }
    
    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(JmsSampleApplication.class, args);
    
        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
    
        // Send a message with a POJO - the template reuse the message converter
        System.out.println("Sending an email message.");
        jmsTemplate.convertAndSend("mailbox.topic", new Email("info@example.com", "Hello"));
        jmsTemplate.convertAndSend("mailbox.queue", new Email("info@example.com", "Hello"));
    
        }
    }
    

    그 듣는 사람

    package org.springboot.jms;
    
    import org.springframework.jms.annotation.JmsListener;
    import org.springframework.stereotype.Component;
    
    /**
     * Created by RGOVIND on 10/20/2016.
     */
    @Component
    public class HelloTopicListener {
    
        @JmsListener(destination = "mailbox.topic", containerFactory = "topicListenerFactory")
        public void receiveTopicMessage(Email email) {
            System.out.println("Received <" + email + ">");
        }
    
        @JmsListener(destination = "mailbox.queue", containerFactory = "queueListenerFactory")
        public void receiveQueueMessage(Email email) {
            System.out.println("Received <" + email + ">");
        }
    }
    

    일단 이것이 끝나면, 당신은 모두 선택 주제에 가입 할 수 있습니다.

    물론 여러 가지 접근 방법이 있습니다. 각 jmsTemplate에 대한 빈의 맵을 가질 수 있습니다. 각각의 큐는 큐 또는 토픽을 기반으로 필요할 때 사용할 수 있습니다. 템플릿 및 빈은이 SO 질문에서 논의하기를 원하는 방식으로 인스턴스화 될 수 있습니다. 희망이 도움이된다.

  2. ==============================

    2.올바른 것으로 표시된 대답은 정확하게 ALMOST입니다. 그것은 아직도 일하지 않습니다.

    올바른 것으로 표시된 대답은 정확하게 ALMOST입니다. 그것은 아직도 일하지 않습니다.

    factory.setPubSubDomain(true) 
    

    와야합니다.

    configurer.configure(factory, connectionFactory);
    

    그렇지 않으면 pubSubDomain 플래그가 true로 설정되어 기본값을 구성 할 때 손실되며 팩토리 인스턴스는 여전히 대기열 및 주제가 아닌 작업을 수행합니다.

  3. ==============================

    3.Spring Boot Application.properties에서 다음 속성을 설정해보십시오.

    Spring Boot Application.properties에서 다음 속성을 설정해보십시오.

    spring.jms.pub-sub-domain=true
    

    그런 다음 주제를 청취하는 데 사용중인 컨테이너 팩토리에 대해이 특성을 사용하십시오.

  4. from https://stackoverflow.com/questions/40144561/how-to-listen-to-topic-using-spring-boot-jms by cc-by-sa and MIT license