[ActiveMQ] Scheduled Message Tutorial

[ActiveMQ] Scheduled Message Tutorial

Goal

  • Scheduled Message를 위한 브로커 서버 설정
  • Scheduled Message 전송 클라이언트 코드 작성


들어가며

  • ActiveMQ는 5.4버전부터 persistent scheduler를 설정할 수 있다.
  • Broker XML 설정을 통해서 이를 활성/비활성화 할 수 있다.


Practice

1. Broker 설정

  • Broker 설정 파일 ($ACITVEMQ_HOME/conf/activemq.xml) 파일에 schedulerSupport=”true” 옵션 추가
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="DorbaeBroker" useJmx="true" schedulerSupport="true">

.
.
.

</broker>

Message property 중 scheduledJobId Job Scheduler가 사용하기 위해서 지정된 값이다. 메시지가 전송하기 전에 설정되는데, 메시지가 즉시 전송되거나 스케줄이 적용이 안 될 수도 있다.
Message Expiration(Time to Live) Confusion 참조

메시지를 수신했을 때, scheduledJobId를 사용할 경우, Camel Route를 적용할 때 message properties도 복사 후에 라우팅 시키도록 적용해야한다.


2. Scheduled Message 전송

2.1. Scheduled Message 관련 설정

Property Name Type Description
AMQ_SCHEDULED_DELAY long Broker가 메시지를 전달 받은 후 전송하기까지 대기 시간. 단위는 millisecond
AMQ_SCHEDULED_PERIOD long 메시지가 처음 전송된 후 반복적으로 다시 메시지를 보낼 때 대기 시간. 단위는 millisecond
AMQ_SCHEDULED_REPEAT int 메시지가 몇 번 반복적으로 전송할지
AMQ_SCHEDULED_CRON String Cron 패턴에 따라서 메시지 전송

AMQ_SCHEDULED_PERIOD, AMQ_SCHEDULED_REPEAT를 설정했을 때, 총 전송되는 메시지 건수는 AMQ_SCHEDULED_REPEAT + 1 (최초 전송)

AMQ_SCHEDULED_CRON, AMQ_SCHEDULED_REPEAT를 설정할 경우, AMQ_SCHEDULED_REPEAT 횟수는 스케줄 때마다 적용된다.
AMQ_SCHEDULED_REPEAT = 5
AMQ_SCHEDULED_CRON = * * * * *
와 같이 설정할 경우, 매 분마다 (AMQ_SCHEDULED_REPEAT + 1) 건이 전송.
60분동안 (60 * (5+1)) = 360건 전송

2.2. Client Java 코드

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
package io.dorbae.test.jms.activemq;

import java.util.Properties;

/*
 * ************************************************************************************
 *
 * ScheduledMessage.java
 * 
 * ************************************************************************************
 * 
 * @version 1.0.00 2016-07-22 dorbae Initialize
 * @since 2016-07-22
 * @author dorbae
 * 
 * ************************************************************************************
 */
public class TestScheduledMessage {

 public TestScheduledMessage() {
  // TODO Auto-generated constructor stub
 }

 public static void main(String[] args) {
  String jmsFactory = "org.apache.activemq.jndi.ActiveMQInitialContextFactory";
  String connectionFactoryName = "ConnectionFactory";
  String jmsUrl = "tcp://localhost:61616";
  String clientId= "Test.ScheduledMessage";
  String queueName = "DORBAE.TEST";

  Properties jmsProps = new Properties();
  jmsProps.put( javax.naming.Context.INITIAL_CONTEXT_FACTORY, jmsFactory); 
  jmsProps.put( javax.naming.Context.PROVIDER_URL, jmsUrl);
  
  javax.naming.InitialContext jndi = null;
  javax.jms.ConnectionFactory connectionFactory = null;
  javax.jms.Connection conn = null;
  javax.jms.Session session = null;
  javax.jms.Destination destination = null;
  javax.jms.Message message = null;
  javax.jms.MessageProducer producer = null;
  
  try {
   jndi = new javax.naming.InitialContext( jmsProps);
   connectionFactory = ( javax.jms.ConnectionFactory)jndi.lookup( connectionFactoryName);
   conn = connectionFactory.createConnection();
   conn.setClientID( clientId);
   session = conn.createSession( false, javax.jms.Session.AUTO_ACKNOWLEDGE); // Not Transacted
   destination = session.createQueue( queueName);
   producer = session.createProducer( destination);
   message = session.createTextMessage( "http://dorbae.blogspot.com");
   
   /*
    * For Delay Message
    * 
    * Message will be sent to destination after delay times
    *  
    * 
   long delayTime = 60L * 1000L; // 1 Minute
   message.setLongProperty( org.apache.activemq.ScheduledMessage.AMQ_SCHEDULED_DELAY, delayTime);
    *
    */
   
   /*
    * For Period Repeat
    * 
    * Repeated messages will be sent to destination waiting period times between each re-delivery 
    * 
   long period = 10L * 1000L;
   int repeat = 5;
   message.setLongProperty( org.apache.activemq.ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
   message.setIntProperty( org.apache.activemq.ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
    *
    */
   
   /*
    * For Cron
    * 
    * Message will be sent to destination according as cron pattern 
    *
    */
   message.setStringProperty( org.apache.activemq.ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
   
   producer.send( message);
   
  } catch ( Exception e) {
   e.printStackTrace();
   
  } finally {
   if ( session != null)
    try {
     session.close();
    } catch ( Exception e) {}
   
   if ( conn != null)
    try {
     conn.close();
    } catch ( Exception e) {}
  }
 }

}
  • Scheduled Message Properties
Property Name Description
ScheduledMessage.AMQ_SCHEDULED_CRON AMQ_SCHEDULED_CRON
ScheduledMessage.AMQ_SCHEDULED_DELAY AMQ_SCHEDULED_DELAY
ScheduledMessage.AMQ_SCHEDULED_ID scheduledJobId
ScheduledMessage.AMQ_SCHEDULED_PERIOD AMQ_SCHEDULED_PERIOD
ScheduledMessage.AMQ_SCHEDULED_REPEAT AMQ_SCHEDULED_REPEAT
ScheduledMessage.AMQ_SCHEDULER_ACTION AMQ_SCHEDULER_ACTION
ScheduledMessage.AMQ_SCHEDULER_ACTION_BROWSE BROWSE
ScheduledMessage.AMQ_SCHEDULER_ACTION_END_TIME ACTION_END_TIME
ScheduledMessage.AMQ_SCHEDULER_ACTION_REMOVE REMOVE
ScheduledMessage.AMQ_SCHEDULER_ACTION_REMOVEALL REMOVEALL
ScheduledMessage.AMQ_SCHEDULER_ACTION_START_TIME ACTION_START_TIME
ScheduledMessage.AMQ_SCHEDULER_MANAGEMENT_DESTINATION ActiveMQ.Scheduler.Management



References

댓글남기기

-->