복붙노트

[SPRING] Spring JMS (ActiveMQ)가 메시지 배달을 지연 시켰습니다.

SPRING

Spring JMS (ActiveMQ)가 메시지 배달을 지연 시켰습니다.

우리는 일부 JMS 메시지에 지연을 설정하려고 시도하기 때문에 x 시간이 지나면 메시지가 대기열에 추가되거나 수신기에서 수신됩니다. 지금까지는 작동하지 않는 2 가지 방법을 시도했습니다.

1) Spring 문서에 따르면 JMSTemplate에 전달 지연을 설정할 수 있습니다. 다음은 시도한 샘플 코드입니다.

@Autowired
private JmsTemplate jmsTemplate;

...
long deliveryDelay = ...;
this.jmsTemplate.setDeliveryDelay(deliveryDelay);
this.jmsTemplate.convertAndSend(
                    queue.getName(),
                    event);
...

그러나 스프링 jms 버전이 4.0.5 인 경우에도 다음 예외가 발생합니다.

java.lang.IllegalStateException: setDeliveryDelay requires JMS 2.0

2) 메시지 자체에 지연 설정을 시도했지만 지연이 무시 된 것처럼 보였으며 메시지는 즉시 전달되었습니다.

@Component
public class MyMessageConverter implements MessageConverter {

...

@Override
public Message toMessage(Object eventObject, Session session) throws JMSException, MessageConversionException {

...
long deliveryDelay = ...;
objectMessage.setLongProperty(
                  ScheduledMessage.AMQ_SCHEDULED_DELAY,
                  deliveryDelay);
return objectMessage;
}
}

spring xml의 jmsTemplate 정의 :

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="cachingConnectionFactory" />
    <property name="messageConverter" ref="myMessageConverter" />
    <property name="sessionTransacted" value="true" />
</bean>

누구든지 문제가 무엇인지 / 지연된 메시징을 달성하는 방법에 대한 다른 아이디어에 대한 제안 사항이 있습니까? 감사!

해결법

  1. ==============================

    1.의견은 답을 준다. 기본적으로 예약 메시지 지원은 비활성화되어 있습니다. 설명서 페이지에 언급 된대로 브로커 XML 구성 파일에서 활성화해야합니다.

    의견은 답을 준다. 기본적으로 예약 메시지 지원은 비활성화되어 있습니다. 설명서 페이지에 언급 된대로 브로커 XML 구성 파일에서 활성화해야합니다.

    스케줄러 지원이 활성화 된 예제 브로커 태그 :

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">
    
  2. ==============================

    2.이 문제를 해결하려면 두 가지 작업을 수행해야합니다.

    이 문제를 해결하려면 두 가지 작업을 수행해야합니다.

  3. ==============================

    3.또한 ActiveMQ BrokerService 클래스의 메소드에 따라 스케줄러 기능을 사용할 수있는 지속성을 구성해야합니다.

    또한 ActiveMQ BrokerService 클래스의 메소드에 따라 스케줄러 기능을 사용할 수있는 지속성을 구성해야합니다.

    public boolean isSchedulerSupport() {
        return this.schedulerSupport && (isPersistent() || jobSchedulerStore != null);
    }
    
  4. ==============================

    4.

      jmsTemplate.convertAndSend(destination, message, new MessagePostProcessor() {
                @Override
                public Message postProcessMessage(Message message) throws JMSException {
                    message.setIntProperty("JMS_OracleDelay", 200);
                    return message;
                }
            });
    
  5. ==============================

    5.JMS 2.0은 activemq 패키지에서 지원되지 않습니다. 대신 인공 지능을 사용해보십시오. 패키지 이름을에서 바꾸어보십시오

    JMS 2.0은 activemq 패키지에서 지원되지 않습니다. 대신 인공 지능을 사용해보십시오. 패키지 이름을에서 바꾸어보십시오

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
            <version>1.5.6.RELEASE</version> 
        </dependency>
    

    으로

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-artemis</artifactId>
            <version>1.5.6.RELEASE</version> 
        </dependency>
    

    또한 application.properties에 추가합니다.

        spring.artemis.mode=native
        spring.artemis.host=localhost
        spring.artemis.port=61616
        spring.artemis.user=admin
        spring.artemis.password=admin
    

    이 기사를 따르라.

  6. ==============================

    6.문서 http://activemq.apache.org/delay-and-schedule-message-delivery.html

    문서 http://activemq.apache.org/delay-and-schedule-message-delivery.html

    예 : 10 초 후 소비자로부터 메시지 수신

    public void send(Object object) {
        log.info("put <" + object + ">");
        jmsTemplate.convertAndSend(QUEUE_NAME, object, m -> {
            m.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, 10000);
            return m;
        });
    }
    
  7. ==============================

    7.

    broker-url: vm://embedded?broker.persistent=true&broker.useShutdownHook=false&broker.schedulerSupport=true
    
  8. from https://stackoverflow.com/questions/25121094/spring-jmsactivemq-delayed-delivery-of-messages by cc-by-sa and MIT license