001    /*
002     * Copyright (c) 2009 The openGion Project.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013     * either express or implied. See the License for the specific language
014     * governing permissions and limitations under the License.
015     */
016    package org.opengion.fukurou.util;
017    
018    import java.util.TimerTask;
019    import java.util.Date;
020    // import java.text.DateFormat;
021    // import java.text.SimpleDateFormat;
022    // import java.util.Locale;
023    
024    import java.util.Map;
025    import java.util.HashMap;
026    import java.util.concurrent.atomic.AtomicInteger;       // 5.5.2.6 (2012/05/25) findbugs対�
027    
028    /**
029     * HybsTimerTask.java ã¯ã€String 型キーã«Stringåž‹å?ã‚?Map ã™ã‚‹ã‚¯ãƒ©ã‚¹ã§ã™ã?
030     *
031     * HTMLã®POST/GETç­‰ã?å—ã‘æ¸¡ã—ã‚„ã€Stringåž‹ã?引数ãŒå¤šã„å ´åˆã«åŠ¹æžœãŒã‚りã¾ã™ã?
032     * 特ã«ã€getHybsTimerTask( String[] param ) ã«ã‚ˆã‚‹å±žæ?リスト作æ?ã¯ã€?
033     * HTMLã‚¿ã‚°ã®å±žæ?定義を行ã†ä¸Šã§?Œéžå¸¸ã«ä¾¿åˆ©ã«åˆ©ç”¨ã§ãã¾ã™ã?
034     *
035     * ã“ã?実è£??åŒæœŸåŒ–ã•れã¾ã›ã‚“ã€?
036     *
037     * @version  4.0
038     * @author   Kazuhiko Hasegawa
039     * @since    JDK5.0,
040     */
041    public abstract class HybsTimerTask extends TimerTask implements Comparable<HybsTimerTask> {      // 4.3.3.6 (2008/11/15) Generics警告対�
042    //      private static int counter = 0;
043            private static AtomicInteger counter = new AtomicInteger();             // 5.5.2.6 (2012/05/25) findbugs対�
044    
045    //      private final DateFormat formatter = new SimpleDateFormat( "HHmmss",Locale.JAPAN );
046            private final int       uniqKey ;                               // タイマã?タスクã®ãƒ¦ãƒ‹ã?クキー
047            private final long      createTime      = System.currentTimeMillis() ;  // オブジェクトãŒç”Ÿæ?ã•ã‚ŒãŸæ™‚刻
048            private String  name                    = null;         // タイマã?タスクã®åç§°
049            private String  comment                 = null;         // タイマã?タスクã®èª¬æ˜?
050            //       3.2.2.0 (2003/05/31) HybsTimerTask ã«å¯¾ã—ã¦ã€è¨­å®šå?を渡ã›ã‚‹ã‚ˆã†ã«å¤‰æ›´ã€?
051            private Map<String,String>        paramMap        = null;         // タイマã?タスクã®ãƒ‘ラメータ 3.6.0.7 (2004/11/06)
052            private String          body            = null;         // タイマã?タスクã®ãƒœãƒ‡ã‚£ãƒ¼è¦ç´?
053            private String          startTime       = "000000";     // 24時間制ã®é–‹å§‹æ™‚刻
054            private String          stopTime        = "000000";     // 24時間制ã®çµ‚äº?™‚刻
055            private int                     startStop       = 0;            // 24æ™‚é–“åˆ¶ã®æ—¥ä»˜ã¾ãŸãŒã‚Šã‚’ãƒã‚§ãƒ?‚¯ã€?
056            private boolean     aliveFlag   = true ;        // æ´»ãã¦ã?‚‹ã‹ã©ã?‹
057            private int                     errorSleep      = 0;            // TimerTask ãŒã‚¨ãƒ©ãƒ¼ã®ã¨ãã?スリープ時é–?s) 3.7.0.4 (2005/03/14)
058    
059            /**
060             * ãƒ?ƒ•ォルトコンストラクター
061             * オブジェクトã?ã€newInstance ã§ã®ã¿ã€ç”Ÿæˆã•れã¾ã™ã?
062             *
063             * @og.rev 5.5.2.6 (2012/05/25) findbugs対応ã?staticフィールドã¸ã®æ›¸ãè¾¼ã¿ã«ã€AtomicInteger を利用ã—ã¾ã™ã?
064             */
065            public HybsTimerTask() {
066                    // 4.3.4.4 (2009/01/01)
067    //              super();
068    //              uniqKey = counter++;
069                    uniqKey = counter.getAndIncrement() ;   // 5.5.2.6 (2012/05/25) findbugs対�
070            }
071    
072            /**
073             * ã“ã?タイマã?タスクã«ã‚ˆã£ã¦å®Ÿè¡Œã•れるアクションã§ã™ã?
074             * ã“ã“ã§ã¯ã€ã‚¨ãƒ©ãƒ¼ãƒˆãƒ©ãƒ??ã‚’å?れã¦ã?¾ã™ã?ã§ã€ã‚µãƒ–クラスã§
075             * å†å®šç¾©ã§ããªã?‚ˆã?«ã€final 化ã—ã¦ã?¾ã™ã?
076             * サブクラスã§ã¯ã€stratDaemon() をオーãƒã?ライドã—ã¦ãã ã•ã„ã€?
077             *
078             * @see java.util.TimerTask#run()
079             * @see #startDaemon()
080             */
081            @Override
082            public final void run() {
083                    try {
084                            if( isExecution() ) {
085                                    startDaemon();
086                            }
087                    }
088                    catch (Throwable th) {
089                            // 3.7.0.4 (2005/03/14)
090                            if( errorSleep > 0 ) {
091                                    try { Thread.sleep( errorSleep * 1000L ); }
092                                    catch( InterruptedException ex ) { LogWriter.log( ex ); }
093                                    System.out.println( th.getMessage() );
094                            }
095                            else {
096                                    cancel();
097                                    throw new RuntimeException( th );
098                            }
099                    }
100            }
101    
102            /**
103             * ã“ã?タイマã?タスクã«ã‚ˆã£ã¦å®Ÿè¡Œã•れるアクションã§ã™ã?
104             * run メソãƒ?ƒ‰ã‚ˆã‚Šå‘¼ã°ã‚Œã¾ã™ã?
105             * サブクラスã§ã¯ã€startDaemon() をオーãƒã?ライドã—ã¦ãã ã•ã„ã€?
106             *
107             * @see #run()
108             */
109            abstract protected void startDaemon() ;
110    
111            /**
112             * ã“ã?タイマã?タスクã«ã‚ˆã£ã¦åˆæœŸåŒ–ã•れるアクションã§ã™ã?
113             * サブクラスã§ã¯ã€initDaemon() をオーãƒã?ライドã—ã¦ãã ã•ã„ã€?
114             *
115             */
116            public void initDaemon() {
117                    // ã“ã“ã§ã¯å‡¦ç?‚’行ã„ã¾ã›ã‚“ã€?
118            }
119    
120            /**
121             * タイマã?タスクã®åç§°(ユニã?クキー)を設定ã—ã¾ã™ã?
122             *
123             * @param   nm タイマã?タスクã®åç§°
124             */
125            public void setName( final String nm ) {
126                    name = nm;
127            }
128    
129            /**
130             * タイマã?タスクã®åç§°(ユニã?クキー)ã‚’å–å¾—ã—ã¾ã™ã?
131             *
132             * @return   タイマã?タスクã®åç§°
133             */
134            public String getName() {
135                    return name;
136            }
137    
138            /**
139             * タイマã?タスクã®èª¬æ˜Žã‚’設定ã—ã¾ã™ã?
140             *
141             * @param   cmt タイマã?タスクã®èª¬æ˜?
142             */
143            public void setComment( final String cmt ) {
144                    comment = cmt;
145            }
146    
147            /**
148             * タイマã?タスクã®èª¬æ˜Žã‚’å–å¾—ã—ã¾ã™ã?
149             *
150             * @return   タイマã?タスクã®èª¬æ˜?
151             */
152            public String getComment() {
153                    return comment;
154            }
155    
156            /**
157             * ã“ã?オブジェクトã?å†?ƒ¨ãƒ¦ãƒ‹ã?クキー値を返ã—ã¾ã™ã?
158             * ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆç”Ÿæˆæ¯Žã«ã€?¼‹ï¼?ã•れã¦ã€å?éƒ¨ã«æŒã£ã¦ã?¾ã™ã?
159             *
160             * @return   オブジェクトã?å†?ƒ¨ãƒ¦ãƒ‹ã?クキー
161             */
162            public int getUniqKey() {
163                    return uniqKey;
164            }
165    
166            /**
167             * ã“ã?オブジェクトãŒç”Ÿæ?ã•ã‚ŒãŸæ™‚刻をミリ秒ã§è¿”ã—ã¾ã™ã?
168             * ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆç”Ÿæˆæ™‚ã«ã€System.currentTimeMillis() ã®å€¤ã‚’å–å¾—ã—ã¦ã?¾ã™ã?
169             *
170             * @return   オブジェクトãŒç”Ÿæ?ã•ã‚ŒãŸæ™‚刻(ミリç§?
171             */
172            public long getCreateTime() {
173                    return createTime;
174            }
175    
176            /**
177             * å†?ƒ¨ã§ä½¿ç”¨ã™ã‚‹ãƒ‘ラメータを設定ã—ã¾ã™ã?
178             *
179             * 外部よりã€å¼•æ•°ã¨ã—ã¦æ¸¡ã•れã¦ãã¾ã™ã?ã“れを利用ã—ã¦ã€å„サブシスãƒ?ƒ ã¯ã€?
180             * パラメーターを設定ã—ãŸã‚Šã€å?期化ã—ãŸã‚Šåˆ©ç”¨å‡ºæ¥ã¾ã™ã?
181             *
182             * @param       map     パラメータマッ�
183             */
184            public void setParameter( final Map<String,String> map ) {
185                    if( map != null ) {
186                            paramMap = new HashMap<String,String>( map );
187                    }
188            }
189    
190            /**
191             * å†?ƒ¨ã§ä½¿ç”¨ã™ã‚‹ãƒ‘ラメータã®ã‚­ãƒ¼ã«å¯¾ã™ã‚‹å€¤ã‚’å–å¾—ã—ã¾ã™ã?
192             *
193             * å?‚µãƒ–シスãƒ?ƒ ã¯ã€ãƒ‘ラメーターを設定ã—ãŸã‚Šã€å?期化ã—ãŸã‚Šåˆ©ç”¨å‡ºæ¥ã¾ã™ã?
194             *
195             * @param       key 引数ã®ã‚­ãƒ¼
196             *
197             * @return      キーã«å¯¾ã™ã‚‹å€¤
198             */
199            public String getValue( final String key ) {
200                    if( paramMap != null && key != null ) {
201                            return paramMap.get( key );
202                    }
203    
204                    return null;
205            }
206    
207            /**
208             * å†?ƒ¨ã§ä½¿ç”¨ã™ã‚‹Bodyè¦ç´??値を設定ã—ã¾ã™ã?
209             *
210             * 外部よりã€å¼•æ•°ã¨ã—ã¦æ¸¡ã•れã¦ãã¾ã™ã?ã“れを利用ã—ã¦ã€å„サブシスãƒ?ƒ ã¯ã€?
211             * パラメーターを設定ã—ãŸã‚Šã€å?期化ã—ãŸã‚Šåˆ©ç”¨å‡ºæ¥ã¾ã™ã?
212             *
213             * @param       body Bodyè¦ç´??値
214             */
215            public void setBody( final String body ) {
216                    this.body = body ;
217            }
218    
219            /**
220             * å†?ƒ¨ã§ä½¿ç”¨ã™ã‚‹Bodyè¦ç´??値をå–å¾—ã—ã¾ã™ã?
221             *
222             * å?‚µãƒ–シスãƒ?ƒ ã¯ã€ãƒ‘ラメーターを設定ã—ãŸã‚Šã€å?期化ã—ãŸã‚Šåˆ©ç”¨å‡ºæ¥ã¾ã™ã?
223             *
224             * @return      Bodyè¦ç´??値
225             */
226            public String getBody() {
227                    return body ;
228            }
229    
230            /**
231             * 24時間制(YYMMDD)ã®é–‹å§‹æ™‚刻を設定ã—ã¾ã™ã?
232             *
233             * æŒ?®šæ™‚刻ç¯?›²å†?§ã®å®Ÿè¡Œã?ã¿è¨±å¯ã™ã‚‹ã‚ˆã†ã«é–‹å§‹æ™‚刻を設定ã—ã¾ã™ã?
234             * ã“れã¯ã€ã‚¿ã‚¤ãƒžã?ã§æŒ?®šã—ãŸé–“éš”ã”ã¨ã«ãƒã‚§ãƒ?‚¯ã‚’å?れるã®ã§ã€ãƒã‚§ãƒ?‚¯æ™‚é–“ã?
235             * é•·ã??åˆã?ã€æ­£ç¢ºã«é–‹å§‹æ™‚刻ã‹ã‚‰å§‹ã¾ã‚‹ã¨ã?†ã‚‚ã?ã§ã¯ã‚りã¾ã›ã‚“ã€?
236             * åˆæœŸå€¤ã¯ã€?000000" ã§ã™ã?
237             *
238             * @param       st 開始時刻
239             */
240            public void setStartTime( final String st ) {
241                    if( st == null || st.length() != 6 ) {
242                            String errMsg = "startTime is inaccurate." +
243                                                            "startTime=[" + st + "]" ;
244                            throw new RuntimeException( errMsg );
245                    }
246                    startTime = st ;
247                    initStartStop();
248            }
249    
250            /**
251             * 24時間制(YYMMDD)ã®çµ‚äº?™‚刻を設定ã—ã¾ã™ã?
252             *
253             * æŒ?®šæ™‚刻ç¯?›²å†?§ã®å®Ÿè¡Œã?ã¿è¨±å¯ã™ã‚‹ã‚ˆã†ã«çµ‚äº?™‚刻を設定ã—ã¾ã™ã?
254             * ã“れã¯ã€ã‚¿ã‚¤ãƒžã?ã§æŒ?®šã—ãŸé–“éš”ã”ã¨ã«ãƒã‚§ãƒ?‚¯ã‚’å?れるã®ã§ã€ãƒã‚§ãƒ?‚¯æ™‚é–“ã?
255             * é•·ã??åˆã?ã€æ­£ç¢ºã«çµ‚äº?™‚刻ã§çµ‚äº?™ã‚‹ã¨ã?†ã‚‚ã?ã§ã¯ã‚りã¾ã›ã‚“ã€?
256             * (終äº?™‚刻を越ãˆã¦ã‹ã‚‰ã®æ–°è¦å®Ÿè¡Œã?ã‚りã¾ã›ã‚“ã€?
257             * åˆæœŸå€¤ã¯ã€?000000" ã§ã™ã?
258             *
259             * @param       st 終äº?™‚刻
260             */
261            public void setStopTime( final String st ) {
262                    if( st == null || st.length() != 6 ) {
263                            String errMsg = "stopTime is inaccurate." +
264                                                            "stopTime=[" + st + "]" ;
265                            throw new RuntimeException( errMsg );
266                    }
267                    stopTime = st ;
268                    initStartStop();
269            }
270    
271            /**
272             * TimerTask ãŒã‚¨ãƒ©ãƒ¼ç™ºç”Ÿæ™‚ã®ã‚¹ãƒªãƒ¼ãƒ—時é–?s) 設定ã—ã¾ã?åˆæœŸå€¤:0)ã€?
273             *
274             * ã“れã¯ã€äºˆæœŸã›ã¬ã‚¨ãƒ©ãƒ¼(ãŸã¨ãˆã?ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ã?スãŒè½ã¡ã¦ã?Ÿãªã©)ã?
275             * 発生ã—ãŸã¨ãã§ã‚‚ã?TimerTask を終äº?•ã›ãšã«ã€Sleep ã•ã›ã¦å¾?©Ÿã•ã›ã‚‹
276             * 事ã«ã‚ˆã‚Šã€åŽŸå›?Œé™¤åŽ»ã•れãŸå?åˆã«ã€è?動復帰ã™ã‚‹ã‚ˆã†ã«ã—ã¾ã™ã?
277             * ã“れã«ã€?¼?を設定ã™ã‚‹ã¨ã€ã‚¨ãƒ©ãƒ¼æ™‚ã«å³ 終äº?—ã¾ã™ã?
278             * 設定ã?ã€ç§’ã§æŒ?®šã—ã¦ãã ã•ã„ã€?
279             *
280             * @param       erTime スリープ時é–?s)(åˆæœŸå€¤:0)
281             */
282            public void setErrorSleepSec( final int erTime ) {
283                    errorSleep = erTime ;
284            }
285    
286            /**
287             * 24時間制ã®é–‹å§?終äº?™‚åˆ»ã®æ—¥ä»˜ã¾ãŸãŒã‚Šã‚’åˆæœŸè¨­å®šã—ã¾ã™ã?
288             *
289             * 開始時刻ã€çµ‚äº?™‚刻ã¯ã€?¼’4時間制ã§ã—ã‹æŒ?®šã§ãã¾ã›ã‚“ã€?日付指定ã§ããªã?
290             * ãã?ãŸã‚ã€æœ?—:ï¼ï¼ã‹ã‚‰å¤œï¼’2:ï¼ï¼ãªã©ã® 開始<終äº?ã®æ™‚ã?å˜ç´”ãªç¯?›²ãƒã‚§ãƒ?‚¯ã§
291             * 判断ã§ãã¾ã™ãŒã€å¤œï¼’2:ï¼ï¼ã‹ã‚‰æœ?—:ï¼ï¼ã«å®Ÿè¡Œã—ãŸã„å ´åˆã?ã€ç•°ãªã‚‹ãƒã‚§ãƒ?‚¯ã?
292             * å¿?¦ã«ãªã‚Šã¾ã™ã?
293             * ã¾ãŸã?開始時刻ã¨çµ‚äº?™‚åˆ»ãŒæœªè¨­å®šã?å ´åˆã‚„ã€åŒã˜æ™‚刻ã®å ´åˆã?ã€å¸¸ã«å®Ÿè¡Œã™ã‚‹å¿?¦ãŒ
294             * ã‚りã¾ã™ã?ã“れらã?ãƒã‚§ãƒ?‚¯ã‚’毎回行ã†ã®ã§ã¯ãªãã?é–‹å§?終äº?™‚刻設定時ã«ãƒã‚§ãƒ?‚¯ã—ã¦
295             * ãŠãã¾ã™ã?
296             *
297             */
298            private void initStartStop() {
299                    if( startTime == null || stopTime == null ) {
300                            startStop = 0;
301                    }
302                    else {
303                            startStop = startTime.compareTo( stopTime );
304                    }
305            }
306    
307            /**
308             * 実行å¯èƒ½æ™‚é–“å†?‹ã©ã?‹ã‚’判定ã—ã¾ã™ã?
309             *
310             * 設定ã•れãŸé–‹å§‹æ™‚刻ã¨çµ‚äº?™‚刻ã«åŸºã¥ã?¦ã€ç¾æ™‚刻ã§å®Ÿè¡Œå¯èƒ½ã‹ã©ã?‹
311             * 判断ã—ã¾ã™ã?
312             *
313             * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用ã™ã‚‹ã‚ˆã†ã«ä¿®æ­£ã—ã¾ã™ã?
314             *
315             * @return      (true:å®Ÿè¡Œè¨±å¯  false:åœæ­¢)
316             */
317            private boolean isExecution() {
318                    boolean rtnFlag = false;
319    //              String time = formatter.format( new Date() );
320                    String time = HybsDateUtil.getDate( "HHmmss" );         // 5.5.7.2 (2012/10/09) HybsDateUtil を利用
321    
322                    if( startStop == 0 ) {
323                            rtnFlag = true;
324                    }
325                    else if( startStop < 0 ) {
326                            if( startTime.compareTo( time ) < 0 &&
327                                    time.compareTo( stopTime )  < 0 ) {
328                                            rtnFlag = true;
329                            }
330                    }
331                    else if( startStop > 0 ) {
332                            if( startTime.compareTo( time ) < 0 ||
333                                    time.compareTo( stopTime )  < 0 ) {
334                                            rtnFlag = true;
335                            }
336                    }
337                    return rtnFlag;
338            }
339    
340            /**
341             * ã“ã?ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã¨æŒ?®šã•れãŸã‚ªãƒ–ジェクトã?é ?ºã‚’比è¼?—ã¾ã™ã?
342             * ã“ã?ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæŒ?®šã•れãŸã‚ªãƒ–ジェクトよりå°ã•ã??åˆã?è²??æ•´æ•°ã€?
343             * ç­‰ã—ã??åˆã?ゼロã€å¤§ãã„å ´åˆã?æ­£ã®æ•´æ•°ã‚’è¿”ã—ã¾ã™ã?
344             *
345             * @param    other 比è¼?¯¾è±¡ã® Object
346             *
347             * @return   ã“ã?ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæŒ?®šã•れãŸã‚ªãƒ–ジェクトよりå°ã•ã??åˆã?è²??æ•´æ•°ã€ç­‰ã—ã??åˆã?ゼロã€å¤§ãã„å ´åˆã?æ­£ã®æ•´æ•°
348             * @throws ClassCastException æŒ?®šã•れãŸã‚ªãƒ–ジェクトã?åž‹ãŒåŽŸå› ã§ã€ã“ã® Object ã¨æ¯”è¼?§ããªã??å?
349             */
350    //      public int compareTo( final Object obj ) {
351    //              HybsTimerTask other = (HybsTimerTask)obj ;
352            public int compareTo( final HybsTimerTask other ) {             // 4.3.3.6 (2008/11/15) Generics警告対�
353    
354                    if( name == null && other.name != null ) { return -1; }
355                    if( name != null && other.name == null ) { return  1; }
356    
357                    if( name != null && other.name != null ) {
358                            int nmComp = name.compareTo( other.name );
359                            if( nmComp != 0 ) { return nmComp; }
360                    }
361    
362                    return ( uniqKey - other.uniqKey );
363            }
364    
365            /**
366             * ã“ã?オブジェクトã?æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
367             * 基本çš?«ãƒ?ƒãƒ?‚°ç›®çš?«ä½¿ç”¨ã—ã¾ã™ã?
368             *
369             * @return ã“ã?ã‚¯ãƒ©ã‚¹ã®æ–?­—å?表ç¾
370             */
371            @Override
372            public String toString() {
373                    return  name + " [" + uniqKey + "]";
374            }
375    
376            /**
377             * ã“ã?オブジェクトã¨ä»–ã?オブジェクトãŒç­‰ã—ã?‹ã©ã?‹ã‚’示ã—ã¾ã™ã?
378             *
379             * @param  object 比è¼?¯¾è±¡ã®å‚ç?オブジェクãƒ?
380             *
381             * @return      å¼•æ•°ã«æŒ?®šã•れãŸã‚ªãƒ–ジェクトã¨ã“ã?オブジェクトãŒç­‰ã—ã??åˆã? trueã€ãã?§ãªã??åˆã? false
382             */
383            @Override
384            public boolean equals( final Object object ) {
385                    if( object == null || !getClass().equals( object.getClass() ) ) { return false; }
386                    if( !super.equals( object ) ) { return false; }
387    
388                    HybsTimerTask other = (HybsTimerTask)object;
389                    return uniqKey == other.uniqKey ;
390            }
391    
392            /**
393             * オブジェクトãŒç”Ÿå­˜ã—ã¦ã?‚‹ã‹ã©ã?‹ã‚’判定ã—ã¾ã™ã?
394             *
395             * @return 生存ã—ã¦ã?‚‹ã‹ã©ã?‹ã€‚true:生å­?/ false:キャンセル済ã¿
396             */
397            public boolean isAlive() {
398                    return aliveFlag ;
399            }
400    
401            /**
402             * オブジェクトã?ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰å?ã‚’è¿”ã—ã¾ã™ã?
403             *
404             * @return ã“ã?オブジェクトã?ãƒãƒƒã‚·ãƒ¥ã‚³ãƒ¼ãƒ‰å?
405             */
406            @Override
407            public int hashCode() {
408                    return uniqKey ;
409            }
410    
411            /**
412             * ã“ã?タイマã?タスクã®cancel() メソãƒ?ƒ‰ã‚’オーãƒã?ライドã—ã¾ã™ã?
413             * <del>HybsTimerTaskManager#cancelTask( int ) を実行ã—ã¾ã™ã?</del>
414             *
415             * @return ã‚­ãƒ£ãƒ³ã‚»ãƒ«ãŒæ­£å¸¸ã«çµ‚äº?§ããŸã‹ã©ã?‹
416             * @see java.util.TimerTask#cancel()
417             */
418            @Override
419            public boolean cancel() {
420                    if( aliveFlag ) {
421                            System.out.println();
422                            System.out.println( toString() + " " + new Date()  + " Stoped" );
423                            aliveFlag = false;              // cancelTask を呼ã¶å‰ã«å¿?šã€Žfalseã€ã«ã—ã¦ãŠãã€?
424                    }
425                    return super.cancel();
426            }
427    }