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