001package com.poscoict.app.job;
002
003import java.io.IOException;
004import java.net.InetAddress;
005import java.net.UnknownHostException;
006import java.util.ArrayList;
007
008import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
009import org.apache.commons.httpclient.HttpClient;
010import org.apache.commons.httpclient.HttpException;
011import org.apache.commons.httpclient.NameValuePair;
012import org.apache.commons.httpclient.methods.PostMethod;
013import org.apache.commons.httpclient.params.HttpMethodParams;
014import org.slf4j.Logger;
015import org.slf4j.LoggerFactory;
016
017import com.poscoict.glueframework.GlueException;
018
019/**
020 * Job ½ÇÇà¿©ºÎ È®ÀÎ Util.
021 * 
022 * <pre>
023 * »ç¿ë¿¹#1
024 * <xmp>
025 * String JobKey = ... ;//sample1.job001
026 * GlueJobDefinition jobDefinition = ...; //new GlueJobDefinition( "-1", JobKey );
027 * String serverAddress = ...; //http://192.168.41.141:8805
028 * GlueJobEventSender sender = ...;// GlueStaticContext.getBeanFactory().getBeanObject( "jobEventSender", GlueJobEventSender.class );
029 * String historyId = sender.sendJobEvent( def, serverAddress + "/scheduler" );
030 * 
031 * String status = GlueJobStatusCheck.getJobStatus(serverAddress, historyId, JobKey );
032 * </xmp>
033 * 
034 * 
035 * »ç¿ë¿¹#2
036 * <xmp>
037 * String JobKey = ... ;//sample1.job001
038 * String serverAddress = ...; //http://192.168.41.141:8805
039 * String ids = GlueJobStatusCheck.getJobHistoryIdsByJobKey(serverAddress, JobKey );
040 * String[] historyIds = ids.split( "," );
041 * for( String historyId : historyIds ){
042 *     String status = GlueJobStatusCheck.getJobStatus(serverAddress, historyId, JobKey );
043 * }
044 * </xmp>
045 * </pre>
046 * 
047 * @see org.apache.commons.httpclient.HttpClient
048 * @see org.apache.commons.httpclient.methods.PostMethod
049 */
050public abstract class GlueJobStatusCheck
051{
052    private static Logger logger = LoggerFactory.getLogger( GlueJobStatusCheck.class );
053
054    /**
055     * @param url GlueJobScheduler Server ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà URLÀÓ
056     * @param requestId Job History ID. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
057     * @param jobKey JobKey. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ. requestId °¡ À¯È¿ÇÑÁö üũÇϴµ¥ »ç¿ëµÊ.
058     * @return COMPLETE,STOPPED,ERROR,MISFIRED,RUNNING µîÀÇ STATUS °ª.
059     */
060    public static String getJobStatus( String url, String requestId, String jobKey )
061    {
062        String ip = null;
063        try
064        {
065            InetAddress localMachine = InetAddress.getLocalHost();
066            ip = localMachine.getHostAddress();
067            return getJobStatus( url, requestId, jobKey, ip, 2 );
068        } catch ( UnknownHostException e )
069        {
070            logger.error( "UnknownHostException", e );
071            return null;
072        }
073    }
074
075    /**
076     * @param url GlueJobScheduler Server ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà URLÀÓ.
077     * @param requestId Job History ID. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
078     * @param jobKey JobKey. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ. requestId °¡ À¯È¿ÇÑÁö üũÇϴµ¥ »ç¿ëµÊ.
079     * @param ip LocalHost ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
080     * @return COMPLETE,STOPPED,ERROR,MISFIRED,RUNNING µîÀÇ STATUS °ª.
081     */
082    public static String getJobStatus( String url, String requestId, String jobKey, String ip )
083    {
084        return getJobStatus( url, requestId, jobKey, ip, 2 );
085    }
086
087    /**
088     * @param url GlueJobScheduler Server ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà URLÀÓ.
089     * @param requestId Job History ID. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
090     * @param jobKey JobKey. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ. requestId °¡ À¯È¿ÇÑÁö üũÇϴµ¥ »ç¿ëµÊ.
091     * @param ip LocalHost ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
092     * @param retryCount HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà ½ÇÆнà Àç½Ãµµ Ƚ¼öÀÓ.
093     * @return COMPLETE,STOPPED,ERROR,MISFIRED,RUNNING µîÀÇ STATUS °ª.
094     */
095    public static String getJobStatus( String url, String requestId, String jobKey, String ip, int retryCount )
096    {
097        HttpClient client = new HttpClient();
098        PostMethod method = new PostMethod( url );
099        // header ¼³Á¤
100        method.addRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=EUC-KR" );
101        // encoding
102
103        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
104        // Request ID, Job Name, Client IP ¼³Á¤
105        nameValuePairs.add( new NameValuePair( "check", "status" ) );
106        nameValuePairs.add( new NameValuePair( GlueSchedulerConstants.REQUEST_ID, requestId ) );
107        nameValuePairs.add( new NameValuePair( "jobKey", jobKey ) );
108        nameValuePairs.add( new NameValuePair( GlueSchedulerConstants.CLIENT_IP, ip ) );
109        // prepare parameters for post
110        NameValuePair[] nvps = new NameValuePair[nameValuePairs.size()];
111        nvps = nameValuePairs.toArray( nvps );
112        method.setRequestBody( nvps );
113
114        // provide custom retry handler is necessary
115        // Request Àü¼Û ½ÇÆÐ ½Ã 2¹ø ´õ ½Ãµµ¸¦ ÇÑ´Ù.
116        method.getParams().setParameter( HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler( retryCount, false ) );
117        String responseBody = null;
118        try
119        {
120            // execute the method
121            int statusCode = client.executeMethod( method );
122            if ( statusCode != GlueSchedulerConstants.STATUS_JOB_SUCCESS )
123            {
124                logger.error( "Method failed: {}", method.getStatusLine() );
125            }
126
127            // read the response body
128            responseBody = new String( method.getResponseBody() );
129
130            // deal with response
131            // use caution: ensure correct character encoding
132            // is not binary data
133            logger.info( "Response Body :{}", responseBody );
134            logger.info( "Status Line :{}", method.getStatusLine() );
135        } catch ( HttpException httpe )
136        {
137            throw new GlueException( "Fatal protocol violation: " + httpe.getMessage(), httpe );
138        } catch ( IOException ioe )
139        {
140            throw new GlueException( "Fatal transport error: " + ioe.getMessage(), ioe );
141        } finally
142        {
143            // release the connection
144            method.releaseConnection();
145        }
146        return responseBody;
147    }
148
149    /**
150     * @param url GlueJobScheduler Server ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà URLÀÓ.
151     * @param jobKey JobKey. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
152     * @return ½ÇÇàÁßÀ̰ųª ´ë±âÁßÀÎ Job Histroy ID. 2°³ ÀÌ»óÀÏ°æ¿ì Äĸ¶(,)·Î ±¸ºÐÇÔ.
153     */
154    public static String getJobHistoryIdsByJobKey( String url, String jobKey )
155    {
156        String ip = null;
157        try
158        {
159            InetAddress localMachine = InetAddress.getLocalHost();
160            ip = localMachine.getHostAddress();
161            return getJobHistoryIdsByJobKey( url, jobKey, ip, 2 );
162        } catch ( UnknownHostException e )
163        {
164            logger.error( "UnknownHostException", e );
165            return null;
166        }
167
168    }
169
170    /**
171     * @param url GlueJobScheduler Server ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà URLÀÓ.
172     * @param jobKey JobKey. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
173     * @param ip LocalHost ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
174     * @return ½ÇÇàÁßÀ̰ųª ´ë±âÁßÀÎ Job Histroy ID. 2°³ ÀÌ»óÀÏ°æ¿ì Äĸ¶(,)·Î ±¸ºÐÇÔ.
175     */
176    public static String getJobHistoryIdsByJobKey( String url, String jobKey, String ip )
177    {
178        return getJobHistoryIdsByJobKey( url, jobKey, ip, 2 );
179    }
180
181    /**
182     * @param url GlueJobScheduler Server ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà URLÀÓ.
183     * @param jobKey JobKey. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
184     * @param ip LocalHost ÁÖ¼Ò. ³»ºÎÀûÀ¸·Î NameValuePair À¸·Î »ý¼ºµÇ¼­ setRequestBody()·Î Àü´ÞµÊ.
185     * @param retryCount HttpClient ¸¦ ÅëÇØ PostMethod ½ÇÇà ½ÇÆнà Àç½Ãµµ Ƚ¼öÀÓ.
186     * @return ½ÇÇàÁßÀ̰ųª ´ë±âÁßÀÎ Job Histroy ID. 2°³ ÀÌ»óÀÏ°æ¿ì Äĸ¶(,)·Î ±¸ºÐÇÔ.
187     */
188    public static String getJobHistoryIdsByJobKey( String url, String jobKey, String ip, int retryCount )
189    {
190        HttpClient client = new HttpClient();
191        PostMethod method = new PostMethod( url );
192        // header ¼³Á¤
193        method.addRequestHeader( "Content-Type", "application/x-www-form-urlencoded; charset=EUC-KR" );
194        // encoding
195
196        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
197        // Request ID, Job Name, Client IP ¼³Á¤
198        nameValuePairs.add( new NameValuePair( "check", "status" ) );
199        nameValuePairs.add( new NameValuePair( "jobKey", jobKey ) );
200        nameValuePairs.add( new NameValuePair( GlueSchedulerConstants.CLIENT_IP, ip ) );
201        // prepare parameters for post
202        NameValuePair[] nvps = new NameValuePair[nameValuePairs.size()];
203        nvps = nameValuePairs.toArray( nvps );
204        method.setRequestBody( nvps );
205
206        // provide custom retry handler is necessary
207        // Request Àü¼Û ½ÇÆÐ ½Ã 2¹ø ´õ ½Ãµµ¸¦ ÇÑ´Ù.
208        method.getParams().setParameter( HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler( retryCount, false ) );
209        String responseBody = null;
210        try
211        {
212            // execute the method
213            int statusCode = client.executeMethod( method );
214            if ( statusCode != GlueSchedulerConstants.STATUS_JOB_SUCCESS )
215            {
216                logger.error( "Method failed: {}", method.getStatusLine() );
217            }
218
219            // read the response body
220            responseBody = new String( method.getResponseBody() );
221
222            // deal with response
223            // use caution: ensure correct character encoding
224            // is not binary data
225            logger.info( "Response Body :{}", responseBody );
226            logger.info( "Status Line :{}", method.getStatusLine() );
227        } catch ( HttpException httpe )
228        {
229            throw new GlueException( "Fatal protocol violation: " + httpe.getMessage(), httpe );
230        } catch ( IOException ioe )
231        {
232            throw new GlueException( "Fatal transport error: " + ioe.getMessage(), ioe );
233        } finally
234        {
235            // release the connection
236            method.releaseConnection();
237        }
238        return responseBody;
239    }
240}