2016-07-05 1 views
1

향후 응용 프로그램에서 스프링 메시징 기능을 테스트하는 응용 프로그램을 프로토 타입하는 중입니다.주제와 대기열을 사용하여 @JmsListener를보다 쉽게 ​​처리 할 수 ​​있습니다.

우리가 필요로하는 한 가지는 동일한 애플리케이션에서 activemq의 주제와 대기열을 처리하는 것입니다. 따라서 동일한 빈에서 @JmsListener에 의해 주석을 붙인 메소드를 가져야한다.이 메소드는 대기열을 듣고 다른 하나는 주제를들을 것이다. 그게 가능하니?

더 간단한 방법은 무엇입니까? this one과 같은 spring-jms로 주제를 사용하는 몇 가지 답변을 보았습니다.이 경우 엔 주제와 대기열에 각각 하나씩 두 개의 DefaultMessageListenerContainer를 만들어야한다고 상상해보십시오. 이것이 최고의 해결책입니까?

이 문제에 대한 특수 효과 접근 방법이 있습니까?

답변

0

프레임 워크는 각각 @JmsListener에 대한 컨테이너 생성을 담당합니다. containerFactory 속성을 통해 사용할 컨테이너 팩토리를 알려 주기만하면됩니다.

JmsDemoApplication.java :

package net.lenthe; 

import javax.jms.ConnectionFactory; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.annotation.Bean; 
import org.springframework.jms.config.DefaultJmsListenerContainerFactory; 

@SpringBootApplication 
public class JmsDemoApplication { 

    @Autowired 
    private ConnectionFactory connectionFactory; 

    @Bean(name = "topicJmsListenerContainerFactory") 
    public DefaultJmsListenerContainerFactory getTopicFactory() { 
     DefaultJmsListenerContainerFactory f = new DefaultJmsListenerContainerFactory(); 
     f.setConnectionFactory(connectionFactory); 
     f.setSessionTransacted(true); 
     f.setPubSubDomain(true); 
     return f; 
    } 

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

MessageListenerBean.java :

package net.lenthe; 

import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.jms.annotation.JmsListener; 
import org.springframework.stereotype.Component; 

@Component 
public class MessageListenerBean { 

    private Logger logger = LoggerFactory.getLogger(this.getClass()); 

    @JmsListener(destination = "myMessageTopic", containerFactory = "topicJmsListenerContainerFactory") 
    public void processTopicMessage(String content) { 
     logger.info("Received topic message. Content is " + content); 
    } 

    @JmsListener(destination = "myMessageQueue") 
    public void processQueueMessage(String content) { 
     logger.info("Received queue message. Content is " + content); 
    } 
} 
다음
1

봄 부팅과 주제에 대한 두 번째 컨테이너 공장을 설정하는 방법에 대한 전체 예입니다