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