Loading...
Spring Framework Reference Documentation 7.0.2의 Sending a Message의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
JmsTemplate에는 메시지를 보내기 위한 많은 편의 메서드가 포함되어 있습니다. send
메서드는 jakarta.jms.Destination 객체를 사용하여 destination을 지정하며, 다른 것들은
JNDI lookup에서 String을 사용하여 destination을 지정합니다. destination argument가 없는
send 메서드는 기본 destination을 사용합니다.
다음 예제는 제공된 Session 객체로부터 텍스트 메시지를 생성하기 위해 MessageCreator
콜백을 사용하는 예입니다:
1import jakarta.jms.ConnectionFactory; 2import jakarta.jms.JMSException; 3import jakarta.jms.Message; 4import jakarta.jms.Queue; 5import jakarta.jms.Session; 6 7import org.springframework.jms.core.MessageCreator; 8import org.springframework.jms.core.JmsTemplate; 9 10public class JmsQueueSender { 11 12 private JmsTemplate jmsTemplate; 13 private Queue queue; 14 15 public void setConnectionFactory(ConnectionFactory cf) { 16 this.jmsTemplate = new JmsTemplate(cf); 17 } 18 19 public void setQueue(Queue queue) { 20 this.queue = queue; 21 } 22 23 public void simpleSend() { 24 this.jmsTemplate.send(this.queue, new MessageCreator() { 25 public Message createMessage(Session session) throws JMSException { 26 return session.createTextMessage("hello queue world"); 27 } 28 }); 29 } 30}
앞의 예제에서, JmsTemplate은 ConnectionFactory에 대한 참조를 전달하여
생성됩니다. 대안으로, 무인자 생성자와 connectionFactory가 제공되며
BeanFactory나 일반 Java 코드를 사용하는 JavaBean 스타일로 인스턴스를 생성하는 데
사용될 수 있습니다.
또는, JMS 설정을 위한 미리 구성된 빈 프로퍼티를 제공하는
Spring의 JmsGatewaySupport 편의 기본 클래스로부터 상속받는 것을 고려할 수 있습니다.
send(String destinationName, MessageCreator creator) 메서드를 사용하면 destination의
문자열 이름을 사용하여 메시지를 보낼 수 있습니다. 이러한 이름이 JNDI에 등록되어 있는
경우, 템플릿의 destinationResolver 프로퍼티를 JndiDestinationResolver 인스턴스로
설정해야 합니다.
JmsTemplate을 생성할 때 기본 destination을 지정한 경우,
send(MessageCreator c)는 그 destination으로 메시지를 보냅니다.
도메인 모델 객체의 전송을 용이하게 하기 위해, JmsTemplate에는 메시지의 데이터
콘텐츠에 대한 인자로 Java 객체를 받는 다양한 send 메서드가 있습니다.
JmsTemplate의 오버로드된 메서드인 convertAndSend()와 receiveAndConvert() 메서드는
변환 과정을 MessageConverter 인터페이스의 인스턴스에 위임합니다.
이 인터페이스는 Java 객체와 JMS 메시지 간의 변환을 위한 간단한 계약을 정의합니다.
기본 구현체인 SimpleMessageConverter는 String과 TextMessage, byte[]와 BytesMessage,
java.util.Map과 MapMessage 간의 변환을 지원합니다. 컨버터를 사용하면,
JMS를 통해 보내지거나 수신되는 비즈니스 객체에 애플리케이션 코드와 함께 집중할 수
있으며, 그것이 JMS 메시지로 어떻게 표현되는지에 대한 세부 사항은 신경 쓰지 않아도
됩니다.
sandbox에는 현재 JavaBean과 MapMessage 간의 변환을 위해 리플렉션을 사용하는
MapMessageConverter가 포함되어 있습니다. 직접 구현할 수 있는 다른 인기 있는 구현
선택지는 JAXB나 XStream과 같은 기존 XML 마샬링 패키지를 사용하여 객체를
나타내는 TextMessage를 생성하는 컨버터입니다.
메시지의 프로퍼티, 헤더, 바디 설정은 컨버터 클래스 안에 일반적으로 캡슐화할 수
없으므로, MessagePostProcessor 인터페이스는 메시지가 변환된 후 전송되기 전에 메시지에
접근할 수 있도록 합니다. 다음 예제는 java.util.Map이 메시지로 변환된 후 메시지
헤더와 프로퍼티를 수정하는 방법을 보여 줍니다:
1import java.util.HashMap; 2import java.util.Map; 3 4import jakarta.jms.JMSException; 5import jakarta.jms.Message; 6 7import org.springframework.jms.core.JmsTemplate; 8import org.springframework.jms.core.MessagePostProcessor; 9 10public class JmsSenderWithConversion { 11 12 private JmsTemplate jmsTemplate; 13 14 public void sendWithConversion() { 15 Map<String, Object> map = new HashMap<>(); 16 map.put("Name", "Mark"); 17 map.put("Age", 47); 18 jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() { 19 public Message postProcessMessage(Message message) throws JMSException { 20 message.setIntProperty("AccountID", 1234); 21 message.setJMSCorrelationID("123-00001"); 22 return message; 23 } 24 }); 25 } 26 27}
이는 다음과 같은 형태의 메시지를 생성합니다:
1MapMessage={ 2 Header={ 3 ... standard headers ... 4 CorrelationID={123-00001} 5 } 6 Properties={ 7 AccountID={Integer:1234} 8 } 9 Fields={ 10 Name={String:Mark} 11 Age={Integer:47} 12 } 13}
| 구분 | 설명 |
|---|---|
이 JMS-specific org.springframework.jms.support.converter.MessageConverter<br>구성은 JMS 메시지 타입에서 동작하며, jakarta.jms.TextMessage, jakarta.jms.BytesMessage 등으로의<br>즉각적인 변환에 책임이 있습니다. 일반 메시지 페이로드를 지원하는 계약이 필요하다면,<br>JmsMessagingTemplate 또는 바람직하게는 JmsClient를 중앙 위임자로 사용하면서<br>org.springframework.messaging.converter.MessageConverter를 사용하십시오. |
SessionCallback and ProducerCallback on JmsTemplatesend 작업은 많은 일반적인 사용 시나리오를 다루지만, 때로는 JMS Session 또는
MessageProducer에 대해 여러 작업을 수행하고 싶을 수 있습니다.
SessionCallback과 ProducerCallback은 각각 JMS Session과 Session /
MessageProducer 쌍을 노출합니다. JmsTemplate의 execute() 메서드는 이러한
콜백 메서드를 실행합니다.
JmsClient1import jakarta.jms.ConnectionFactory; 2 3import org.springframework.jms.core.JmsClient; 4import org.springframework.messaging.Message; 5import org.springframework.messaging.support.MessageBuilder; 6 7public class JmsClientSample { 8 9 private final JmsClient jmsClient; 10 11 public JmsClientSample(ConnectionFactory connectionFactory) { 12 // For custom options, use JmsClient.builder(ConnectionFactory) 13 this.jmsClient = JmsClient.create(connectionFactory); 14 } 15 16 public void sendWithConversion() { 17 this.jmsClient.destination("myQueue") 18 .withTimeToLive(1000) 19 .send("myPayload"); // optionally with a headers Map next to the payload 20 } 21 22 public void sendCustomMessage() { 23 Message<?> message = MessageBuilder.withPayload("myPayload").build(); // optionally with headers 24 this.jmsClient.destination("myQueue") 25 .withTimeToLive(1000) 26 .send(message); 27 } 28}
애플리케이션은 종종 예를 들어 모든 outgoing 메시지에 메시지 프로퍼티를 추가하기 위해,
메시지가 전송되기 전에 이를 가로챌 필요가 있습니다.
spring-messaging Message를 기반으로 하는 org.springframework.messaging.core.MessagePostProcessor는
JmsClient에 설정되었을 때 이를 수행할 수 있습니다. 이는 send 및 sendAndReceive
메서드로 전송되는 모든 outgoing 메시지에 사용됩니다.
다음은 모든 outgoing 메시지에 "tenantId" 프로퍼티를 추가하는 인터셉터의 예입니다.
1import jakarta.jms.ConnectionFactory; 2 3import org.springframework.jms.core.JmsClient; 4import org.springframework.messaging.Message; 5import org.springframework.messaging.core.MessagePostProcessor; 6import org.springframework.messaging.support.MessageBuilder; 7 8public class JmsClientWithPostProcessor { 9 10 private final JmsClient jmsClient; 11 12 public JmsClientWithPostProcessor(ConnectionFactory connectionFactory) { 13 this.jmsClient = JmsClient.builder(connectionFactory) 14 .messagePostProcessor(new TenantIdMessageInterceptor("42")) 15 .build(); 16 } 17 18 public void sendWithPostProcessor() { 19 this.jmsClient.destination("myQueue") 20 .withTimeToLive(1000) 21 .send("myPayload"); 22 } 23 24 static class TenantIdMessageInterceptor implements MessagePostProcessor { 25 26 private final String tenantId; 27 28 public TenantIdMessageInterceptor(String tenantId) { 29 this.tenantId = tenantId; 30 } 31 32 @Override 33 public Message<?> postProcessMessage(Message<?> message) { 34 return MessageBuilder.fromMessage(message) 35 .setHeader("tenantId", this.tenantId) 36 .build(); 37 } 38 } 39}
Using Spring JMS
Receiving a Message