[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 |
댓글남기기