[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.방금 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.올바른 것으로 표시된 대답은 정확하게 ALMOST입니다. 그것은 아직도 일하지 않습니다.
올바른 것으로 표시된 대답은 정확하게 ALMOST입니다. 그것은 아직도 일하지 않습니다.
factory.setPubSubDomain(true)
와야합니다.
configurer.configure(factory, connectionFactory);
그렇지 않으면 pubSubDomain 플래그가 true로 설정되어 기본값을 구성 할 때 손실되며 팩토리 인스턴스는 여전히 대기열 및 주제가 아닌 작업을 수행합니다.
-
==============================
3.Spring Boot Application.properties에서 다음 속성을 설정해보십시오.
Spring Boot Application.properties에서 다음 속성을 설정해보십시오.
spring.jms.pub-sub-domain=true
그런 다음 주제를 청취하는 데 사용중인 컨테이너 팩토리에 대해이 특성을 사용하십시오.
from https://stackoverflow.com/questions/40144561/how-to-listen-to-topic-using-spring-boot-jms by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring Batch - 입력 csv 파일의 헤더 행을 검증하고 파일이 무효화되면 건너 뜁니다. (0) | 2019.04.12 |
---|---|
[SPRING] @ JsonProperty 예상대로 작동하지 않습니다. (0) | 2019.04.12 |
[SPRING] RestTemplate을 사용한 기본 인증 - 컴파일 오류 - 생성자 HttpClient ()가 표시되지 않습니다. (0) | 2019.04.12 |
[SPRING] Scala.Option을위한 Spring RequestParam 포매터 (0) | 2019.04.12 |
[SPRING] 내 logback 자바 기반 (no xml) 구성이 무시됩니다. (0) | 2019.04.12 |