    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 */
    016package org.opengion.hayabusa.taglib;
    017
    018import static org.opengion.fukurou.util.StringUtil.nval;
    019
    020import javax.jms.QueueSession;
    021
    022import org.opengion.fukurou.queue.QueueInfo;
    023import org.opengion.fukurou.queue.QueueSend;
    024import org.opengion.fukurou.queue.QueueSendFactory;
    025import org.opengion.fukurou.util.StringUtil;
    026import org.opengion.hayabusa.common.HybsSystem;
    027
    028/**
    029 * キュー送信 キュー送信用のタグです。
    030 *
    031 *@og.formSample
    032 * ●形式：&lt;og:queueSend queueType=&quot;mq&quot; mqQueueName=&quot;queue01&quot; message=&quot;テキスト&quot; /&gt;
    033 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    034 *
    035 * ●Tag定義：
    036 *    &lt;og:queueSend
    037 *        jmsServer             【TAG】JMSサーバの接続先を指定します。JNDI名で指定します。(初期値:jms/Default)
    038 *                                     ※別途コンテキストファイルに接続情報が記載されている必要があります。
    039 *        queueType             【TAG】タイプ(MQ,SQS)を指定します。
    040 *        mqTransacted          【TAG】トランザクション確認応答フラグを指定します。(MQ用)(初期値:false)
    041 *                                         true:トランザクション確認応答 false: 確認応答タイプに指定した確認応答
    042 *        mqAcknowledgeMode     【TAG】確認応答タイプを指定します。(MQ用)(初期値:1)
    043 *                                         1:AUTO_ACKNOWLEDTE(自動応答:１回の配信を保障)
    044 *                                         2:CLIENT_ACKNOWLEDE(クライアント応答)
    045 *                                         3:DUPS_OK_ACKNOWLEDTE(自動応答：複数回の配信可能性あり)
    046 *        mqQueueName           【TAG】キュー名を指定します。(MQ用)
    047 *        message               【TAG】送信するメッセージを指定します。
    048 *        sqsFifoGroupId        【TAG】グループIDを指定します。(SQSのFIFOキュータイプ用)
    049 *        sqsFifoDedupliId      【TAG】重複排除IDを指定します。(SQSのFIFOキュータイプ用)
    050 *
    051 * ● 使用例
    052 *        ・&lt;og:queueSend queueType=&quot;mq&quot; mqQueueName=&quot;queue01&quot; message=&quot;送信テキスト&quot; /&gt;
    053 *        ・&lt;og:queueSend queueType=&quot;mq&quot; mqQueueName=&quot;queue01&quot; /&gt;
    054 *               送信テキスト
    055 *           &lt;/og:queueSend&gt;
    056 *        ・&lt;og:queueSend queueType=&quot;sqs&quot; sqsGroupId=&quot;group01&quot; message=&quot;送信テキスト&quot; /&gt;
    057 *
    058 * @og.group 画面部品
    059 *
    060 * @og.rev 5.10.14.0 (2019/08/01) 新規作成
    061 *
    062 * @version 5
    063 * @author oota
    064 * @since JDK7
    065 *
    066 */
    067public class QueueSendTag extends CommonTagSupport {
    068        private static final String VERSION = "7.2.9.4 (2020/11/20)" ;
    069        private static final long serialVersionUID = 729420201120L ;
    070
    071        // 変数宣言
    072        private static final String CLOUD_SQS_ACCESS_KEY = HybsSystem.sys( "CLOUD_SQS_ACCESS_KEY" );
    073        private static final String CLOUD_SQS_SECRET_KEY = HybsSystem.sys( "CLOUD_SQS_SECRET_KEY" );
    074
    075        private String jmsServer;
    076        private Boolean mqTransacted;
    077        private int mqAcknowledgeMode = QueueSession.AUTO_ACKNOWLEDGE;
    078        private String mqQueueName;
    079        private Boolean mqAsync;
    080        private String message;
    081        private String queueType;
    082        private String sqsFifoGroupId;
    083        private String sqsFifoDedupliId;
    084
    085        /**
    086         * デフォルトコンストラクター
    087         *
    088         * @og.rev 7.2.9.4 (2020/11/20) PMD:Each class should declare at least one constructor.
    089         */
    090        public QueueSendTag() { super(); }              // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    091
    092        /**
    093         * タグリブオブジェクトをリリースします。
    094         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    095         */
    096        @Override
    097        protected void release2() {
    098                super.release2();
    099                jmsServer                       = null;
    100                mqTransacted            = false;
    101                mqAcknowledgeMode       = QueueSession.AUTO_ACKNOWLEDGE;
    102                mqQueueName                     = null;
    103                mqAsync                         = false;
    104                message                         = null;
    105                queueType                       = null;
    106                sqsFifoGroupId          = null;
    107                sqsFifoDedupliId        = null;
    108        }
    109
    110        /**
    111         * Taglibの開始タグが見つかった時に処理する doStartTag() をオーバライドします。
    112         *
    113         * @return 後続処理のsiji
    114         *
    115         */
    116        @Override
    117        public int doStartTag() {
    118                if( useTag() ) {
    119                        // Body部を評価。
    120                        return EVAL_BODY_BUFFERED;              // Body を評価する
    121                }
    122                return SKIP_BODY;               // Body を評価しない
    123        }
    124
    125        /**
    126         * Taglibのタグ本体を処理する doAfterBody() をオーバーライドします。
    127         *
    128         * @return 後続処理の指示
    129         */
    130        @Override
    131        public int doAfterBody() {
    132                // 属性項目のmessageを優先。
    133                if (StringUtil.isNull(message)) {
    134                        message = getBodyString();
    135                }
    136                return SKIP_BODY;
    137        }
    138
    139        /**
    140         * Taglibの終了タグが見つかった時に処理する doEndTag() をオーバーライドします。
    141         *
    142         * @og.rev 5.10.15.0 (2019/08/30)アクセスキー修正
    143         *
    144         * @return 後続処理の指示
    145         */
    146        @Override
    147        public int doEndTag() {
    148                debugPrint();
    149
    150                if( useTag() ) {
    151                        // QueueSendクラスの生成
    152                        final QueueSend queueSend = QueueSendFactory.newQueueSend(queueType);
    153
    154                        try {
    155                                // 1. 接続
    156                                System.out.println("start connect");
    157                                // @og.rev 5.10.15.0 (2019/08/30) sqs用のアクセスキーは引数から設定
    158                                // queueSend.connect(jmsServer);
    159                                queueSend.connect(jmsServer, CLOUD_SQS_ACCESS_KEY, CLOUD_SQS_SECRET_KEY);
    160
    161                                // 2. 送信キュー情報の設定
    162                                final QueueInfo queueInfo = new QueueInfo();
    163                                // sql用情報
    164                                queueInfo.setSqsFifoGroupId(sqsFifoGroupId);
    165                                queueInfo.setSqsFifoDedupliId(sqsFifoDedupliId);
    166                                // mq用情報
    167                                queueInfo.setMqTransacted(mqTransacted);
    168                                queueInfo.setMqAcknowledgeMode(mqAcknowledgeMode);
    169                                queueInfo.setMqQueueName(mqQueueName);
    170                                // メッセージ
    171                                queueInfo.setMessage(message);
    172
    173                                // 3. 送信処理
    174        //                      System.out.println("start send");
    175                                queueSend.sendMessage(queueInfo);
    176                        } finally {
    177                                // 4. 接続クローズ
    178        //                      System.out.println("start close");
    179                                queueSend.close();
    180                        }
    181                }
    182
    183                return EVAL_PAGE;
    184        }
    185
    186        /** Setter */
    187        /**
    188         * 【TAG】メッセージサーバのURLを指定します。
    189         *
    190         * @og.tag
    191         * 送信先のメッセージサーバのURLを指定します。
    192         *
    193         * @param server JMSサーバの接続先
    194         */
    195        public void setJmsServer(final String server) {
    196                jmsServer = nval(getRequestParameter(server), jmsServer);
    197        }
    198
    199        /**
    200         * 【TAG】MQトランザクション処理判定を指定します。
    201         *
    202         * @og.tag
    203         * MQトランザクションの処理判定を指定します。
    204         * true：受信側でコミット、ロールバックのトランザクション応答を行います。
    205         * ※trueの場合は、MQ確認応答タイプは無効になります。
    206         * false：受信側はMQ確認応答タイプに指定した値によって、確認応答を行います。
    207         *
    208         * @param flg トランザクション処理フラグ
    209         */
    210        public void setMqTransacted(final String flg) {
    211                mqTransacted = nval(getRequestParameter(flg), mqTransacted);
    212        }
    213
    214        /**
    215         * 【TAG】MQ確認応答タイプを指定します。
    216         *
    217         * @og.tag
    218         * MQ確認応答タイプを指定します。
    219         * ※MQトランザクション処理判定にはfalseを指定して下さい。
    220         *
    221         * 1：AUTO_ACKNOWLEDGE
    222         * メッセージの配信の通知をjmsサーバーが自動的に処理するモードです。
    223         * １回だけの配信を保障します。
    224         * 2：CLIENT_ACKNOWLEDGE
    225         * 確認応答を受信側が行うモードです。
    226         * 受信側に確認応答の実行が必要です。
    227         * 3：DUPS_OK_ACKNOWLEDGE
    228         * AUTO_AKNOWLEDGEと同様にjmsサーバーが自動的に処理を行います。
    229         * 複数回配信される可能性があります。(処理が軽い事がメリットです。
    230         * 基本的にはAUTO_ACKNOWLEDGEを推奨します。)
    231         *
    232         * @param mode 確認応答モード
    233         */
    234        public void setMqAcknowledgeMode(final String mode) {
    235                mqAcknowledgeMode = nval(getRequestParameter(mode), mqAcknowledgeMode);
    236        }
    237
    238        /**
    239         * 【TAG】MQキュー名を指定します。
    240         *
    241         * @og.tag
    242         * MQタイプのキューを利用時、
    243         * メッセージを格納するキュー名を指定します。
    244         *
    245         * @param qName MQキュー名
    246         */
    247        public void setMqQueueName(final String qName) {
    248                mqQueueName = nval(getRequestParameter(qName), mqQueueName);
    249        }
    250
    251        /**
    252         * 【TAG】メッセージを指定します。
    253         *
    254         * @og.tag
    255         * 送信するメッセージを指定します。
    256         *
    257         * @param mess メッセージ
    258         */
    259        public void setMessage(final String mess) {
    260                message = nval(getRequestParameter(mess), message);
    261        }
    262
    263        /**
    264         * 【TAG】キューのタイプを指定します。
    265         *
    266         * @og.tag
    267         * 利用するメッセージサーバのタイプを指定します。
    268         * 下記のタイプが利用可能です。
    269         *
    270         * mq : ActiveQueue or AmazonMQ
    271         * sqs：AmazonSQS
    272         *
    273         * @param qType キュータイプ
    274         */
    275        public void setQueueType(final String qType) {
    276                queueType = nval(getRequestParameter(qType), queueType);
    277        }
    278
    279        /**
    280         * 【TAG】SQSのFIFOタイプキューのグループIDを指定します。
    281         *
    282         * @og.tag
    283         * awsのSQSのFIFOタイプキューを利用時、
    284         * グループIDを指定します。
    285         * 同一の値内で、FIFOの配信順序が保障されます。
    286         *
    287         * @param sqsGid SQSFIFOタイプキューのグループID
    288         */
    289        public void setSqsFifoGroupId(final String sqsGid) {
    290                sqsFifoGroupId = nval(getRequestParameter(sqsGid), sqsFifoGroupId);
    291        }
    292
    293        /**
    294         * 【TAG】 SQSのFIFOタイプキューの重複排除IDを指定します。
    295         *
    296         * @og.tag
    297         * awsのSQSのFIFOタイプキューを利用時、
    298         * 重複排除IDを指定します。
    299         * 5分間同一の値が送信された場合、キューに格納しない機能です。
    300         * aws側の設定で、メッセージを暗号化した値を、自動設定することも可能です。
    301         *
    302         * @param sqsFifoDid SQSFIFOタイプキューの重複禁止ID
    303         */
    304        public void setSqsFifoDedupliId(final String sqsFifoDid) {
    305                sqsFifoDedupliId = nval(getRequestParameter(sqsFifoDid), sqsFifoDedupliId);
    306        }
    307
    308        /**
    309         * このオブジェクトの文字列表現を返します。
    310         * 基本的にデバッグ目的に使用します。
    311         *
    312         * @return このクラスの文字列表現
    313         */
    314        @Override
    315        public String toString() {
    316                return org.opengion.fukurou.util.ToString.title(this.getClass().getName())
    317                                .println("VERSION", VERSION)
    318                                .println("jmsServer ", jmsServer)
    319                                .println("mqTransacted", mqTransacted)
    320                                .println("mqAcknowledgeMode", mqAcknowledgeMode)
    321                                .println("mqQueueName", mqQueueName)
    322                                .println("mqAsync", mqAsync)
    323                                .println("message", message)
    324                                .println("queueType", queueType)
    325                                .println("sqsFifoGroupId", sqsFifoGroupId)
    326                                .println("sqsFifoDedupliId", sqsFifoDedupliId).fixForm().toString();
    327        }
    328}