Spring JMS 시작하기

1. 개요

Spring은 JMS API의 사용을 단순화하는 JMS 통합 프레임 워크를 제공합니다. 이 기사에서는 이러한 통합의 기본 개념을 소개합니다.

2. Maven 종속성

애플리케이션에서 Spring JMS를 사용하려면 pom.xml에 필요한 아티팩트를 추가해야합니다 .

 org.springframework spring-jms 4.3.3.RELEASE  

최신 버전의 아티팩트는 여기에서 찾을 수 있습니다.

3. JmsTemplate

JmsTemplate 클래스는 메시지를 전송하거나 동 기적으로 수신 할 때 리소스 생성 및 해제를 처리합니다.

따라서이 JmsTemplate 을 사용하는 클래스 는 메서드 정의에 지정된대로 콜백 인터페이스 만 구현하면됩니다.

Spring 4.1부터 JmsMessagingTemplate 은 메시징 추상화 (예 : org.springframework.messaging.Message) 와의 통합을 제공하는 JmsTemplate 위에 빌드됩니다 . 이를 통해 일반적인 방식으로 보낼 메시지를 만들 수 있습니다.

4. 연결 관리

연결하고 메시지를 송수신 할 수 있으려면 ConnectionFactory 를 구성해야합니다 .

ConnectionFactory를는 관리자에 의해 미리 개체를 투여 JMS 중 하나이다 . 구성의 도움을받는 클라이언트는 JMS 공급자와 연결합니다.

Spring은 두 가지 유형의 ConnectionFactory를 제공합니다 .

  • SingleConnectionFactory – 모든 createConnection () 호출에서 동일한 연결을 반환하고 close ()호출을 무시하는 ConnectionFactory 인터페이스의 구현입니다.
  • CachingConnectionFactorySingleConnectionFactory 의 기능을 확장하고 Sessions , MessageProducers MessageConsumers 캐싱을 추가하여 기능을향상시킵니다.

5. 목적지 관리

위에서 설명한대로 ConnectionFactory 와 함께 대상도 JMS 관리 객체이며 JNDI에서 저장 및 검색 할 수 있습니다.

Spring은 DynamicDestinationResolver 와 같은 일반적인 해결 자와 JndiDestinationResolver 와 같은 특정 해결 자를 제공합니다 .

JmsTemplate의는 우리의 선택에 내놓고 구현 중 하나에 대상 이름의 해상도를 위임합니다.

또한 defaultDestination 이라는 속성을 제공합니다.이 속성 은 특정 대상을 참조하지 않는 보내기받기 작업에 사용 됩니다.

6. 메시지 변환

Spring JMS는 메시지 변환기의 지원 없이는 불완전합니다.

ConvertAndSend ()ReceiveAndConvert () 작업 모두에 대해 JmsTemplate 에서 사용하는 기본 변환 전략 은 SimpleMessageConverter 클래스입니다.

SimpleMessageConverterTextMessages , BytesMessages , MapMessagesObjectMessages 를 처리 할 수 ​​있습니다 . 이 클래스는 MessageConverter 인터페이스를 구현합니다 .

SimpleMessageConverter 외에도 Spring JMS는 MappingJackson2MessageConverter , MarshallingMessageConverter , MessagingMessageConverter 와 같은 다른 MessageConverter 클래스를 즉시 제공합니다 .

또한 MessageConverter 인터페이스의 toMessage ()FromMessage () 메서드 를 구현하여 사용자 지정 메시지 변환 기능을 만들 수 있습니다 .

사용자 정의 구현에 우리가 샘플 코드를 보자 는 MessageConverter를 ,

public class SampleMessageConverter implements MessageConverter { public Object fromMessage(Message message) throws JMSException, MessageConversionException { //... } public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException { //... } }

7. 샘플 Spring JMS

이 섹션에서는 JmsTemplate 을 사용하여 메시지를 보내고받는 방법을 살펴 봅니다 .

메시지를 보내는 기본 방법은 JmsTemplate.send () 입니다. 두 가지 주요 매개 변수가 있는데 첫 번째 매개 변수는 JMS 대상이고 두 번째 매개 변수는 MessageCreator 의 구현입니다 . JmsTemplate 은 메시지 생성을 위해 MessageCreator 의 콜백 메소드 createMessage () 를 사용합니다.

JmsTemplate.send () 는 일반 텍스트 메시지를 보내는 데 적합하지만 사용자 지정 메시지를 보내기 위해 JmsTemplate 에는 c onvertAndSend () 라는 또 다른 메서드가 있습니다.

이러한 메서드의 구현은 아래에서 볼 수 있습니다.

public class SampleJmsMessageSender { private JmsTemplate jmsTemplate; private Queue queue; // setters for jmsTemplate & queue public void simpleSend() { jmsTemplate.send(queue, s -> s.createTextMessage("hello queue world")); }
 public void sendMessage(Employee employee) { System.out.println("Jms Message Sender : " + employee); Map map = new HashMap(); map.put("name", employee.getName()); map.put("age", employee.getAge()); jmsTemplate.convertAndSend(map); } }

아래는 메시지 수신자 클래스이며이를 MDP (Message-Driven POJO)라고합니다. SampleListener 클래스 가 MessageListener 인터페이스를 구현하고 인터페이스 메서드 onMessage ()에 대한 텍스트 특정 구현을 제공하고 있음을 알 수 있습니다.

onMessage () 메서드와 별도로 SampleListener 클래스는 사용자 지정 메시지를 수신하기 위해 receiveAndConvert () 메서드라고도 합니다.

public class SampleListener implements MessageListener { public JmsTemplate getJmsTemplate() { return getJmsTemplate(); } public void onMessage(Message message) { if (message instanceof TextMessage) { try { String msg = ((TextMessage) message).getText(); System.out.println("Message has been consumed : " + msg); } catch (JMSException ex) { throw new RuntimeException(ex); } } else { throw new IllegalArgumentException("Message Error"); } } public Employee receiveMessage() throws JMSException { Map map = (Map) getJmsTemplate().receiveAndConvert(); return new Employee((String) map.get("name"), (Integer) map.get("age")); } }

MessageListener 를 구현하는 방법을 보았고 아래에서 Spring 애플리케이션 컨텍스트의 구성을 볼 수 있습니다.

DefaultMessageListenerContainer 는 Spring이 다른 많은 특수 컨테이너와 함께 제공하는 기본 메시지 리스너 컨테이너입니다.

8. Basic Configuration With Java Annotations

The @JmsListener is the only annotation required to convert a method of a normal bean into a JMS listener endpoint. Spring JMS provides many more annotations to ease the JMS implementation.

We can see some of the sample classes annotated below:

@JmsListener(destination = "myDestination") public void SampleJmsListenerMethod(Message order) { ... }

In order to add multiple listeners to a single method we just need to add multiple @JmsListener annotations.

We need to add the @EnableJms annotation to one of our configuration classes to support the @JmsListener annotated methods:

@Configuration @EnableJms public class AppConfig { @Bean public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); return factory; } }

9. Error Handler

We can also configure a custom error handler for our message listener container.

Let's first implement the org.springframework.util.ErrorHandler interface:

@Service public class SampleJmsErrorHandler implements ErrorHandler { // ... logger @Override public void handleError(Throwable t) { LOG.warn("In default jms error handler..."); LOG.error("Error Message : {}", t.getMessage()); } }

Note that we have overridden the handleError() method, which simply logs the error message.

And then, we need to reference our error handler service in the DefaultJmsListenerConnectionFactory using the setErrorHandler() method:

@Bean public DefaultJmsListenerContainerFactorybjmsListenerContainerFactory() { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory()); factory.setErrorHandler(sampleJmsErrorHandler); return factory; }

With this, our configured error handler will now catch any unhandled exceptions and log the message.

Optionally, we can also configure the error handler using the plain-old XML configurations by updating our appContext.xml:

10. Conclusion

In this tutorial, we discussed the configuration and basic concepts of Spring JMS. We also had a brief look at the Spring-specific JmsTemplate classes which are used for sending and receiving messages.

GitHub 프로젝트에서 코드 구현을 찾을 수 있습니다.