본문 바로가기

SPRING/SPRING BOOT V3.0.6 REFERENCE

[Spring Boot Reference V3.0.6] Spring Boot Messaging

반응형

Spring Framework는 JmsTemplate메시지를 비동기식으로 수신하기 위한 완전한 인프라를 사용하여 JMS API의 단순화된 사용에서 메시징 시스템과의 통합을 위한 광범위한 지원을 제공합니다. Spring AMQP는 Advanced Message Queuing Protocol과 유사한 기능 세트를 제공합니다. RabbitTemplateSpring Boot는 또한 RabbitMQ 에 대한 자동 구성 옵션을 제공합니다 . Spring WebSocket은 기본적으로 STOMP 메시징에 대한 지원을 포함하고 Spring Boot는 스타터 및 소량의 자동 구성을 통해 이를 지원합니다. Spring Boot는 Apache Kafka도 지원합니다.

1. JMS

인터페이스 는 JMS 브로커와 상호 작용하기 위한 jakarta.jms.ConnectionFactory표준 생성 방법을 제공합니다 . jakarta.jms.ConnectionSpring은 JMS와 함께 작동해야 하지만 ConnectionFactory일반적으로 직접 사용할 필요는 없으며 대신 상위 수준의 메시징 추상화에 의존할 수 있습니다. ( 자세한 내용은 Spring Framework 참조 문서의 관련 섹션을 참조하십시오.) Spring Boot는 또한 메시지를 보내고 받는 데 필요한 인프라를 자동 구성합니다.

1.1. ActiveMQ 지원

클래스 경로에서 ActiveMQ를 사용할 수 있는 경우 Spring Boot는 ConnectionFactory.

  를 사용하면 spring-boot-starter-activemqJMS와 통합하기 위한 Spring 인프라와 마찬가지로 ActiveMQ 인스턴스에 연결하는 데 필요한 종속성이 제공됩니다.

ActiveMQ 구성은 NET의 외부 구성 속성에 의해 제어됩니다 spring.activemq.*. 기본적으로 ActiveMQ는 기본적으로 에 연결하는 TCP 전송을 사용하도록 자동 구성됩니다 tcp://localhost:61616. 다음 예는 기본 브로커 URL을 변경하는 방법을 보여줍니다.

spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret
 

기본적으로 a는 다음에서 외부 구성 속성으로 제어할 수 있는 합리적인 설정으로 CachingConnectionFactory네이티브를 래핑합니다 .ConnectionFactoryspring.jms.*

spring.jms.cache.session-cache-size=5
 

네이티브 풀링을 사용하려는 경우 다음 예와 같이 종속성을 추가 org.messaginghub:pooled-jms하고 적절하게 구성하여 그렇게 할 수 있습니다.JmsPoolConnectionFactory

spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
 
  ActiveMQProperties지원되는 옵션에 대한 자세한 내용은 를 참조하십시오 . ActiveMQConnectionFactoryCustomizer고급 사용자 정의를 위해 구현하는 임의 개수의 bean을 등록할 수도 있습니다 .

기본적으로 ActiveMQ는 아직 존재하지 않는 대상을 생성하여 제공된 이름에 대해 대상이 확인되도록 합니다.

1.2. ActiveMQ Artemis 지원

Spring Boot는 클래스 경로에서 ActiveMQ Artemis를ConnectionFactory 사용할 수 있음을 감지하면 자동 구성할 수 있습니다 . 브로커가 있으면 포함된 브로커가 자동으로 시작되고 구성됩니다(모드 등록 정보가 명시적으로 설정되지 않은 경우). 지원되는 모드는 (내장된 브로커가 필요하고 클래스 경로에서 브로커를 사용할 수 없는 경우 오류가 발생해야 함을 명시하기 위한 것) 및 (전송 프로토콜을 사용하여 브로커에 연결하는 것 )입니다. 후자가 구성되면 Spring Boot는 기본 설정으로 로컬 머신에서 실행 중인 브로커에 연결하는 를 구성합니다.embeddednativenettyConnectionFactory

  spring-boot-starter-artemis를 사용하는 경우 기존 ActiveMQ Artemis 인스턴스에 연결하는 데 필요한 종속성과 JMS와 통합하는 Spring 인프라가 제공됩니다. org.apache.activemq:artemis-jakarta-server를 응용 프로그램에 추가하면 내장 모드를 사용할 수 있습니다.

ActiveMQ Artemis 구성은 NET의 외부 구성 속성에 의해 제어됩니다 spring.artemis.*. 예를 들어 에서 다음 섹션을 선언할 수 있습니다 application.properties.

spring.artemis.mode=native
spring.artemis.broker-url=tcp://192.168.1.210:9876
spring.artemis.user=admin
spring.artemis.password=secret
 

브로커를 포함할 때 지속성을 활성화하고 사용할 수 있도록 해야 하는 대상을 나열할지 여부를 선택할 수 있습니다. 이것들은 쉼표로 구분된 목록으로 지정되어 기본 옵션으로 만들거나 고급 대기열 및 주제 구성에 대해 각각 org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration또는 유형의 bean을 정의할 수 있습니다 .org.apache.activemq.artemis.jms.server.config.TopicConfiguration

기본적으로 a는 다음에서 외부 구성 속성으로 제어할 수 있는 합리적인 설정으로 CachingConnectionFactory네이티브를 래핑합니다 .ConnectionFactoryspring.jms.*

spring.jms.cache.session-cache-size=5
 

기본 풀링을 사용하려는 경우 다음 예제와 같이 org.messaginghub:pooled-jms에 대한 종속성을 추가하고 적절하게 구성하여 그렇게 할 수 있습니다 .JmsPoolConnectionFactory

spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50
 

지원되는 추가 옵션은 를 참조하십시오 ArtemisProperties.

JNDI 조회가 필요하지 않으며 nameArtemis 구성의 속성 또는 구성을 통해 제공된 이름을 사용하여 대상이 해당 이름에 대해 확인됩니다.

1.3. JNDI ConnectionFactory 사용

애플리케이션 서버에서 애플리케이션을 실행 중인 경우 Spring Boot는 ConnectionFactoryJNDI를 사용하여 JMS를 찾으려고 시도합니다. 기본적으로 java:/JmsXA및 java:/XAConnectionFactory위치가 선택되어 있습니다. spring.jms.jndi-name다음 예제와 같이 대체 위치를 지정해야 하는 경우 속성을 사용할 수 있습니다 .

spring.jms.jndi-name=java:/MyConnectionFactory
 

1.4. 메시지 보내기

Spring은 JmsTemplate자동 구성되며 다음 예제와 같이 자신의 bean에 직접 자동 연결할 수 있습니다.

@Component
public class MyBean {

    private final JmsTemplate jmsTemplate;

    public MyBean(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    // ...

}
 
  JmsMessagingTemplate비슷한 방식으로 주입할 수 있습니다. a DestinationResolver또는 MessageConverterbean이 정의되면 자동으로 구성된 에 자동으로 연결됩니다 JmsTemplate.

1.5. 메시지 수신

JMS 기반 구조가 있는 경우 @JmsListener수신기 끝점을 만들기 위해 모든 빈에 주석을 달 수 있습니다. no가 JmsListenerContainerFactory정의된 경우 기본 값이 자동으로 구성됩니다. a DestinationResolver, a MessageConverter또는 jakarta.jms.ExceptionListenerbean이 정의된 경우 자동으로 기본 팩터리와 연결됩니다.

기본적으로 기본 팩터리는 트랜잭션입니다. 가 있는 인프라에서 실행하는 경우 JtaTransactionManager기본적으로 리스너 컨테이너에 연결됩니다. 그렇지 않은 경우 sessionTransacted플래그가 활성화됩니다. @Transactional후자의 시나리오에서는 수신기 메서드(또는 그 대리자)를 추가하여 로컬 데이터 저장소 트랜잭션을 수신 메시지 처리에 연결할 수 있습니다 . 이렇게 하면 로컬 트랜잭션이 완료되면 들어오는 메시지가 확인됩니다. 여기에는 동일한 JMS 세션에서 수행된 응답 메시지 보내기도 포함됩니다.

다음 구성 요소는 someQueue대상에 리스너 엔드포인트를 생성합니다.

@Component
public class MyBean {

    @JmsListener(destination = "someQueue")
    public void processMessage(String content) {
        // ...
    }

}
 
  자세한 내용은 Javadoc을@EnableJms 참조하십시오 .

더 많은 인스턴스를 생성해야 하거나 JmsListenerContainerFactory기본값을 재정의하려는 경우 Spring Boot는 자동 구성된 것과 동일한 설정으로 DefaultJmsListenerContainerFactoryConfigurer초기화하는 데 사용할 수 있는 를 제공합니다.DefaultJmsListenerContainerFactory

예를 들어 다음 예제는 특정을 사용하는 다른 팩터리를 노출합니다 MessageConverter.

@Configuration(proxyBeanMethods = false)
public class MyJmsConfiguration {

    @Bean
    public DefaultJmsListenerContainerFactory myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        ConnectionFactory connectionFactory = getCustomConnectionFactory();
        configurer.configure(factory, connectionFactory);
        factory.setMessageConverter(new MyMessageConverter());
        return factory;
    }

    private ConnectionFactory getCustomConnectionFactory() {
        return ...
    }

}
 

그런 다음 다음과 같이 -annotated 메서드에서 팩토리를 사용할 수 있습니다 @JmsListener.

@Component
public class MyBean {

    @JmsListener(destination = "someQueue", containerFactory = "myFactory")
    public void processMessage(String content) {
        // ...
    }

}
 

2. AMQP

AMQP(Advanced Message Queuing Protocol)는 메시지 지향 미들웨어를 위한 플랫폼 중립적인 유선 수준 프로토콜입니다. Spring AMQP 프로젝트는 핵심 Spring 개념을 AMQP 기반 메시징 솔루션 개발에 적용합니다. Spring Boot는 "Starter"를 포함하여 RabbitMQ를 통해 AMQP로 작업할 수 있는 몇 가지 편리한 기능을 제공합니다 spring-boot-starter-amqp.

2.1. RabbitMQ 지원

RabbitMQ 는 AMQP 프로토콜을 기반으로 하는 가볍고 안정적이며 확장 가능한 휴대용 메시지 브로커입니다. Spring은 RabbitMQ를 사용하여 AMQP 프로토콜을 통해 통신합니다.

RabbitMQ 구성은 NET의 외부 구성 속성에 의해 제어됩니다 spring.rabbitmq.*. 예를 들어 에서 다음 섹션을 선언할 수 있습니다 application.properties.

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=secret
 

또는 다음 속성을 사용하여 동일한 연결을 구성할 수 있습니다 addresses.

spring.rabbitmq.addresses=amqp://admin:secret@localhost
 
  그런 식으로 주소를 지정하면 host및 port속성이 무시됩니다. 주소가 amqps프로토콜을 사용하는 경우 SSL 지원이 자동으로 활성화됩니다.

RabbitProperties지원되는 속성 기반 구성 옵션에 대한 자세한 내용은 를 참조하십시오 . ConnectionFactorySpring AMQP에서 사용하는 RabbitMQ의 하위 수준 세부 정보를 구성하려면 ConnectionFactoryCustomizerbean을 정의합니다.

빈이 컨텍스트에 존재하는 경우 ConnectionNameStrategy자동 구성에 의해 생성된 연결의 이름을 지정하는 데 자동으로 사용됩니다 CachingConnectionFactory.

에 대한 애플리케이션 전체의 추가 사용자 정의를 수행하려면 bean을 RabbitTemplate사용하십시오 RabbitTemplateCustomizer.

  자세한 내용은 RabbitMQ에서 사용하는 프로토콜인 AMQP 이해를 참조하세요 .

2.2. 메시지 보내기

Spring의 AmqpTemplate및 AmqpAdmin자동 구성되며 다음 예제와 같이 자신의 bean에 직접 자동으로 연결할 수 있습니다.

@Component
public class MyBean {

    private final AmqpAdmin amqpAdmin;

    private final AmqpTemplate amqpTemplate;

    public MyBean(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) {
        this.amqpAdmin = amqpAdmin;
        this.amqpTemplate = amqpTemplate;
    }

    // ...

}
 
  RabbitMessagingTemplate비슷한 방식으로 주입할 수 있습니다. bean이 정의 되면 MessageConverterauto-configured에 자동으로 연결됩니다 AmqpTemplate.

필요한 경우 org.springframework.amqp.core.QueueBean으로 정의된 모든 항목은 자동으로 RabbitMQ 인스턴스에서 해당 대기열을 선언하는 데 사용됩니다.

작업을 재시도하려면 다음에서 재시도를 활성화할 수 있습니다 AmqpTemplate(예: 브로커 연결이 끊어진 경우).

spring.rabbitmq.template.retry.enabled=true
spring.rabbitmq.template.retry.initial-interval=2s
 

재시도는 기본적으로 비활성화되어 있습니다. RetryTemplate빈 을 선언하여 프로그래밍 방식 으로 사용자 정의할 수도 있습니다 RabbitRetryTemplateCustomizer.

더 많은 인스턴스를 생성해야 하거나 RabbitTemplate기본값을 재정의하려는 경우 Spring Boot는 자동 구성에서 사용하는 팩토리와 동일한 설정으로 RabbitTemplateConfigurer초기화하는 데 사용할 수 있는 빈을 제공합니다.RabbitTemplate

2.3. 메시지를 스트림으로 보내기

특정 스트림에 메시지를 보내려면 다음 예와 같이 스트림의 이름을 지정합니다.

spring.rabbitmq.stream.name=my-stream
 

MessageConverter, StreamMessageConverter또는 bean이 정의된 경우 ProducerCustomizer자동으로 구성된 에 자동으로 연결됩니다 RabbitStreamTemplate.

더 많은 인스턴스를 생성해야 하거나 RabbitStreamTemplate기본값을 재정의하려는 경우 Spring Boot는 자동 구성에서 사용하는 팩토리와 동일한 설정으로 RabbitStreamTemplateConfigurer초기화하는 데 사용할 수 있는 빈을 제공합니다.RabbitStreamTemplate

2.4. 메시지 수신

Rabbit 인프라가 있는 경우 @RabbitListener수신기 끝점을 만들기 위해 모든 빈에 주석을 달 수 있습니다. no가 RabbitListenerContainerFactory정의된 경우 기본값이 SimpleRabbitListenerContainerFactory자동으로 구성되며 속성을 사용하여 직접 컨테이너로 전환할 수 있습니다 spring.rabbitmq.listener.type. MessageConverter또는 Bean이 정의 되면 MessageRecoverer자동으로 기본 팩토리와 연결됩니다.

다음 샘플 구성 요소는 대기열에 수신기 엔드포인트를 생성합니다 someQueue.

@Component
public class MyBean {

    @RabbitListener(queues = "someQueue")
    public void processMessage(String content) {
        // ...
    }

}
 
  자세한 내용은 Javadoc을@EnableRabbit 참조하십시오 .

더 많은 인스턴스를 생성해야 하거나 RabbitListenerContainerFactory기본값을 재정의하려는 경우 Spring Boot는 자동 구성에서 사용하는 팩토리와 동일한 설정으로 a 및 a를 초기화하는 데 사용할 수 있는 SimpleRabbitListenerContainerFactoryConfigurer및 a를 제공합니다.DirectRabbitListenerContainerFactoryConfigurerSimpleRabbitListenerContainerFactoryDirectRabbitListenerContainerFactory

  선택한 컨테이너 유형은 중요하지 않습니다. 이 두 개의 빈은 자동 구성에 의해 노출됩니다.

예를 들어 다음 구성 클래스는 특정을 사용하는 다른 팩터리를 노출합니다 MessageConverter.

@Configuration(proxyBeanMethods = false)
public class MyRabbitConfiguration {

    @Bean
    public SimpleRabbitListenerContainerFactory myFactory(SimpleRabbitListenerContainerFactoryConfigurer configurer) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        ConnectionFactory connectionFactory = getCustomConnectionFactory();
        configurer.configure(factory, connectionFactory);
        factory.setMessageConverter(new MyMessageConverter());
        return factory;
    }

    private ConnectionFactory getCustomConnectionFactory() {
        return ...
    }

}
 

그런 다음 다음과 같이 주석이 달린 메서드에서 팩토리를 사용할 수 있습니다 @RabbitListener.

@Component
public class MyBean {

    @RabbitListener(queues = "someQueue", containerFactory = "myFactory")
    public void processMessage(String content) {
        // ...
    }

}
 

수신기가 예외를 throw하는 상황을 처리하기 위해 재시도를 활성화할 수 있습니다. 기본적으로 가 사용되지만 를 직접 RejectAndDontRequeueRecoverer정의할 수 있습니다 . MessageRecoverer재시도가 소진되면 메시지가 거부되고 브로커가 그렇게 구성된 경우 메시지가 삭제되거나 데드 레터 교환으로 라우팅됩니다. 기본적으로 재시도는 비활성화되어 있습니다. RetryTemplate빈 을 선언하여 프로그래밍 방식 으로 사용자 정의할 수도 있습니다 RabbitRetryTemplateCustomizer.

  기본적으로 재시도가 비활성화되고 리스너에서 예외가 발생하면 배달이 무기한 재시도됩니다. 두 가지 방법으로 이 동작을 수정할 수 있습니다. 재전송이 전혀 시도되지 않도록 defaultRequeueRejected속성을 로 설정하거나 메시지가 거부되어야 한다는 신호를 보내기 위해 를 발생시킵니다. 후자는 재시도가 활성화되고 최대 배달 시도 횟수에 도달했을 때 사용되는 메커니즘입니다. falseAmqpRejectAndDontRequeueException

3. 아파치 카프카 지원

Apache Kafka는 프로젝트 의 자동 구성을 제공하여 지원됩니다 spring-kafka.

Kafka 구성은 NET의 외부 구성 속성에 의해 제어됩니다 spring.kafka.*. 예를 들어 에서 다음 섹션을 선언할 수 있습니다 application.properties.

spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=myGroup
 
  시작 시 주제를 생성하려면 유형의 bean을 추가하십시오 NewTopic. 주제가 이미 존재하는 경우 해당 Bean은 무시됩니다.

지원되는 추가 옵션은 를 참조하십시오 KafkaProperties.

3.1. 메시지 보내기

Spring은 KafkaTemplate자동 구성되며 다음 예제와 같이 자신의 bean에서 직접 자동으로 연결할 수 있습니다.

@Component
public class MyBean {

    private final KafkaTemplate<String, String> kafkaTemplate;

    public MyBean(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    // ...

}
 
  속성 spring.kafka.producer.transaction-id-prefix이 정의되면 a가 KafkaTransactionManager자동으로 구성됩니다. 또한 RecordMessageConverterbean이 정의되면 auto-configured 에 자동으로 연결됩니다 KafkaTemplate.

3.2. 메시지 수신

Apache Kafka 인프라가 있는 경우 @KafkaListener수신기 끝점을 만들기 위해 모든 빈에 주석을 달 수 있습니다. no KafkaListenerContainerFactory가 정의된 경우 기본 키는 에 정의된 키로 자동 구성됩니다 spring.kafka.listener.*.

다음 구성 요소는 someTopic주제에 대한 리스너 엔드포인트를 생성합니다.

@Component
public class MyBean {

    @KafkaListener(topics = "someTopic")
    public void processMessage(String content) {
        // ...
    }

}
 

빈이 정의 되면 KafkaTransactionManager자동으로 컨테이너 팩토리에 연결됩니다. 마찬가지로 RecordFilterStrategy, CommonErrorHandler또는 bean이 정의된 경우 자동으로 기본 AfterRollbackProcessor팩터 ConsumerAwareRebalanceListener리에 연결됩니다.

수신기 유형에 따라 RecordMessageConverter또는 BatchMessageConverterbean이 기본 팩터리에 연결됩니다. RecordMessageConverter배치 리스너에 대한 빈만 있는 경우 BatchMessageConverter.

  사용자 지정은 일반적으로 자동 구성된 빈을 참조하므로 ChainedKafkaTransactionManager표시해야 합니다 . @PrimaryKafkaTransactionManager

3.3. 카프카 스트림

StreamsBuilderSpring for Apache Kafka 는 개체를 생성하고 해당 스트림의 수명 주기를 관리하는 팩터리 빈을 제공합니다 . Spring Boot는 클래스 경로에 있고 Kafka Streams가 주석에 의해 활성화되어 있는 KafkaStreamsConfiguration한 필요한 bean을 자동 구성합니다 .kafka-streams@EnableKafkaStreams

Kafka Streams를 활성화한다는 것은 애플리케이션 ID와 부트스트랩 서버를 설정해야 함을 의미합니다. 전자는 를 사용하여 구성할 수 있으며 설정하지 않은 경우 spring.kafka.streams.application-id기본값은 입니다 spring.application.name. 후자는 전체적으로 설정하거나 스트림에 대해서만 특별히 재정의할 수 있습니다.

전용 속성을 사용하여 몇 가지 추가 속성을 사용할 수 있습니다. 다른 임의의 Kafka 속성은 네임스페이스를 사용하여 설정할 수 있습니다 spring.kafka.streams.properties. 자세한 내용은 추가 Kafka 속성을 참조하십시오 .

팩토리 빈을 사용하려면 다음 예와 같이 StreamsBuilder연결 하십시오.@Bean

@Configuration(proxyBeanMethods = false)
@EnableKafkaStreams
public class MyKafkaStreamsConfiguration {

    @Bean
    public KStream<Integer, String> kStream(StreamsBuilder streamsBuilder) {
        KStream<Integer, String> stream = streamsBuilder.stream("ks1In");
        stream.map(this::uppercaseValue).to("ks1Out", Produced.with(Serdes.Integer(), new JsonSerde<>()));
        return stream;
    }

    private KeyValue<Integer, String> uppercaseValue(Integer key, String value) {
        return new KeyValue<>(key, value.toUpperCase());
    }

}
 

기본적으로 객체가 관리하는 스트림은 StreamBuilder자동으로 시작됩니다. 속성을 사용하여 이 동작을 사용자 지정할 수 있습니다 spring.kafka.streams.auto-startup.

3.4. 추가 Kafka 속성

자동 구성에서 지원하는 속성은 부록의 "통합 속성" 섹션에 나와 있습니다. 대부분의 경우 이러한 속성(하이픈으로 연결된 또는 camelCase)은 Apache Kafka 점선 속성에 직접 매핑됩니다. 자세한 내용은 Apache Kafka 설명서를 참조하십시오.

이러한 속성 중 처음 몇 개는 모든 구성 요소(생산자, 소비자, 관리자 및 스트림)에 적용되지만 다른 값을 사용하려는 경우 구성 요소 수준에서 지정할 수 있습니다. Apache Kafka는 중요도가 HIGH, MEDIUM 또는 LOW인 속성을 지정합니다. Spring Boot 자동 구성은 중요도가 높은 모든 속성, 일부 선택된 MEDIUM 및 LOW 속성, 기본값이 없는 모든 속성을 지원합니다.

Kafka에서 지원하는 속성의 하위 집합만 클래스를 통해 직접 사용할 수 있습니다 KafkaProperties. 직접 지원되지 않는 추가 속성으로 생산자 또는 소비자를 구성하려면 다음 속성을 사용하십시오.

spring.kafka.properties[prop.one]=first
spring.kafka.admin.properties[prop.two]=second
spring.kafka.consumer.properties[prop.three]=third
spring.kafka.producer.properties[prop.four]=fourth
spring.kafka.streams.properties[prop.five]=fifth
 

이렇게 하면 공통 prop.oneKafka 속성이 first(생산자, 소비자 및 관리자에게 적용됨), prop.two관리자 속성이 로 second, prop.three소비자 속성이 로 third, prop.four생산자 속성이 로 fourth, prop.five스트림 속성이 로 설정됩니다 fifth.

다음과 같이 Spring Kafka를 구성할 수도 있습니다 JsonDeserializer.

spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.properties[spring.json.value.default.type]=com.example.Invoice
spring.kafka.consumer.properties[spring.json.trusted.packages]=com.example.main,com.example.another
 

JsonSerializer마찬가지로 헤더에서 유형 정보를 보내는 기본 동작을 비활성화할 수 있습니다 .

spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer
spring.kafka.producer.properties[spring.json.add.type.headers]=false
 
  이러한 방식으로 설정된 속성은 Spring Boot가 명시적으로 지원하는 모든 구성 항목을 재정의합니다.

3.5. Embedded Kafka로 테스트하기

Spring for Apache Kafka는 임베디드 Apache Kafka 브로커로 프로젝트를 테스트하는 편리한 방법을 제공합니다. @EmbeddedKafka이 기능을 사용하려면 모듈 에서 테스트 클래스에 주석을 답니다 spring-kafka-test. 자세한 내용은 Spring for Apache Kafka 참조 설명서 를 참조하십시오 .

EmbeddedKafkaBrokerSpring Boot 자동 구성이 앞서 언급한 임베디드 Apache Kafka 브로커와 함께 작동하도록 하려면 임베디드 브로커 주소( 로 채워짐 )에 대한 시스템 속성을 Apache Kafka의 Spring Boot 구성 속성으로 다시 매핑해야 합니다 . 이를 수행하는 방법에는 여러 가지가 있습니다.

  • spring.kafka.bootstrap-servers포함된 브로커 주소를 테스트 클래스 에 매핑하기 위한 시스템 속성을 제공합니다 .
static {
    System.setProperty(EmbeddedKafkaBroker.BROKER_LIST_PROPERTY, "spring.kafka.bootstrap-servers");
}
 
  • 주석 에서 속성 이름을 구성합니다 @EmbeddedKafka.
@SpringBootTest
@EmbeddedKafka(topics = "someTopic", bootstrapServersProperty = "spring.kafka.bootstrap-servers")
class MyTest {

    // ...

}
 
  • 구성 속성에서 자리 표시자 사용:
spring.kafka.bootstrap-servers=${spring.embedded.kafka.brokers}
 

4. RSocket

RSocket은 바이트 스트림 전송에 사용하기 위한 바이너리 프로토콜입니다. 단일 연결을 통해 전달되는 비동기 메시지를 통해 대칭 상호 작용 모델을 활성화합니다.

Spring Framework의 모듈 spring-messaging은 클라이언트와 서버 측 모두에서 RSocket 요청자와 응답자에 대한 지원을 제공합니다. RSocket 프로토콜의 개요를 포함하여 자세한 내용은 Spring Framework 참조의 RSocket 섹션을 참조하세요 .

4.1. RSocket 전략 자동 구성

Spring Boot는 RSocket 페이로드를 인코딩 및 디코딩하는 데 필요한 모든 인프라를 제공하는 빈을 자동 구성합니다 RSocketStrategies. 기본적으로 자동 구성은 다음을 순서대로 구성하려고 시도합니다.

  1. Jackson을 사용한 CBOR 코덱
  2. Jackson을 사용한 JSON 코덱

스타터 spring-boot-starter-rsocket는 두 종속성을 모두 제공합니다. 사용자 정의 가능성에 대한 자세한 내용은 Jackson 지원 섹션을 참조하십시오 .

RSocketStrategies개발자는 인터페이스 를 구현하는 빈을 생성하여 구성 요소를 사용자 정의할 수 있습니다 RSocketStrategiesCustomizer. @Order코덱의 순서를 결정하므로 중요합니다 .

4.2. RSocket 서버 자동 구성

Spring Boot는 RSocket 서버 자동 구성을 제공합니다. 필요한 종속성은 spring-boot-starter-rsocket.

Spring Boot를 사용하면 WebFlux 서버에서 WebSocket을 통해 RSocket을 노출하거나 독립 RSocket 서버를 세울 수 있습니다. 이것은 응용 프로그램의 유형과 해당 구성에 따라 다릅니다.

WebFlux 애플리케이션(유형 WebApplicationType.REACTIVE)의 경우 RSocket 서버는 다음 속성이 일치하는 경우에만 웹 서버에 연결됩니다.

spring.rsocket.server.mapping-path=/rsocket
spring.rsocket.server.transport=websocket
 
  RSocket 자체가 해당 라이브러리로 빌드되었으므로 RSocket을 웹 서버에 연결하는 것은 Reactor Netty에서만 지원됩니다.

또는 RSocket TCP 또는 websocket 서버가 독립적인 임베디드 서버로 시작됩니다. 종속성 요구 사항 외에 유일하게 필요한 구성은 해당 서버에 대한 포트를 정의하는 것입니다.

spring.rsocket.server.port=9898
 

4.3. 스프링 메시징 RSocket 지원

Spring Boot는 RSocket용 Spring Messaging 인프라를 자동으로 구성합니다.

이는 Spring Boot가 RSocketMessageHandler애플리케이션에 대한 RSocket 요청을 처리할 bean을 생성함을 의미합니다.

4.4. RSocketRequester로 RSocket 서비스 호출

서버와 클라이언트 간에 채널이 설정 되면 RSocket모든 당사자가 상대방에게 요청을 보내거나 받을 수 있습니다.

서버로서 RSocketRequesterRSocket의 모든 핸들러 메서드에 인스턴스를 주입할 수 있습니다 @Controller. 클라이언트로서 먼저 RSocket 연결을 구성하고 설정해야 합니다. RSocketRequester.BuilderSpring Boot는 예상되는 코덱을 사용하여 이러한 경우에 대해 자동 구성 하고 모든 RSocketConnectorConfigurer빈을 적용합니다.

인스턴스 RSocketRequester.Builder는 프로토타입 빈이므로 각 주입 지점에서 새 인스턴스를 제공합니다. 이 빌더는 상태가 저장되어 있고 동일한 인스턴스를 사용하여 다른 설정으로 요청자를 생성하면 안 되기 때문에 의도적으로 수행됩니다.

다음 코드는 일반적인 예를 보여줍니다.

@Service
public class MyService {

    private final RSocketRequester rsocketRequester;

    public MyService(RSocketRequester.Builder rsocketRequesterBuilder) {
        this.rsocketRequester = rsocketRequesterBuilder.tcp("example.org", 9898);
    }

    public Mono<User> someRSocketCall(String name) {
        return this.rsocketRequester.route("user").data(name).retrieveMono(User.class);
    }

}
 

5. 스프링 통합

Spring Boot는 "Starter" 를 포함하여 Spring Integration 작업을 위한 여러 편의를 제공합니다 spring-boot-starter-integration. Spring Integration은 메시징 및 HTTP, TCP 등과 같은 기타 전송에 대한 추상화를 제공합니다. 클래스 경로에서 Spring 통합을 사용할 수 있는 경우 주석을 통해 초기화됩니다 @EnableIntegration.

Spring Integration 폴링 로직은 자동 구성된TaskScheduler . 기본값 PollerMetadata(매초 무제한 메시지 수 폴링)은 spring.integration.poller.*구성 속성으로 사용자 정의할 수 있습니다.

Spring Boot는 또한 추가 Spring 통합 모듈의 존재에 의해 트리거되는 일부 기능을 구성합니다. spring-integration-jmx클래스 경로에도 있으면 메시지 처리 통계가 JMX를 통해 게시됩니다 . 사용 가능한 경우 spring-integration-jdbc다음 행과 같이 시작 시 기본 데이터베이스 스키마를 생성할 수 있습니다.

spring.integration.jdbc.initialize-schema=always
 

사용 가능한 경우 spring-integration-rsocket개발자는 속성을 사용하여 RSocket 서버를 구성 하고 들어오는 RSocket 메시지를 처리하기 위해 구성 요소를 사용 "spring.rsocket.server.*"하도록 할 수 있습니다. 이 인프라는 Spring Integration RSocket 채널 어댑터 및 핸들러를 처리할 수 있습니다( 구성된 경우).IntegrationRSocketEndpointRSocketOutboundGateway@MessageMapping"spring.integration.rsocket.server.message-mapping-enabled"

Spring Boot는 구성 속성을 사용하여 자동 구성할 수도 있습니다 ClientRSocketConnector.

# Connecting to a RSocket server over TCP
spring.integration.rsocket.client.host=example.org
spring.integration.rsocket.client.port=9898
 
# Connecting to a RSocket Server over WebSocket
spring.integration.rsocket.client.uri=ws://example.org
 

자세한 내용  IntegrationAutoConfiguration및 클래스를 참조하십시오.IntegrationProperties

6. 웹소켓

Spring Boot는 임베디드 Tomcat, Jetty 및 Undertow에 대한 WebSockets 자동 구성을 제공합니다. 독립 실행형 컨테이너에 war 파일을 배포하는 경우 Spring Boot는 컨테이너가 WebSocket 지원 구성을 담당한다고 가정합니다.

Spring Framework는 모듈을 통해 쉽게 액세스할 수 있는 MVC 웹 애플리케이션에 대한 풍부한 WebSocket 지원을spring-boot-starter-websocket 제공합니다 .

WebSocket 지원은 반응형 웹 애플리케이션 에서도 사용할 수 있으며 다음과 같이 WebSocket API를 포함해야 합니다 spring-boot-starter-webflux.

<dependency>
    <groupId>jakarta.websocket</groupId>
    <artifactId>jakarta.websocket-api</artifactId>
</dependency>
 

7. 다음에 읽을 내용

다음 섹션에서는 애플리케이션에서 IO 기능을 활성화하는 방법을 설명합니다. 이 섹션에서 캐싱 , 메일 , 유효성 검사 , 나머지 클라이언트 등에 대해 읽을 수 있습니다 .

 

출처

https://docs.spring.io/spring-boot/docs/current/reference/html/messaging.html#messaging

반응형