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