/* * 著作権表記 TODO 要否をお客様に確認 */ package com.pgf.mqspring; import java.util.Objects; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.core.JmsTemplate; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.pgf.mqspring.component.MqSpringMessageSourceComponent; import com.pgf.mqspring.component.TelegramInfoComponent; import com.pgf.mqspring.constant.MqSpringMessageId; import com.pgf.mqspring.exception.MqSpringException; import com.pgf.mqspring.model.ReplyRequestModel; import com.pgf.mqspring.service.MqReceiveService; import com.pgf.mqspring.service.MqSendService; /** * MQ-REST-APIメインクラス *

* HTTPリクエストを受け付けるControllerを内包する。 * */ @SpringBootApplication @RestController @EnableJms public class MqSpringApplication { static private ConfigurableApplicationContext context = null; static private JmsTemplate jmsTemplate = null; static private Logger logger = null; static private boolean isProvidingService = true; /** 送信キュー名 */ @Value("${ibm.mq.queueName.send}") private String sendQueueName; /** 受信キュー名 */ @Value("${ibm.mq.queueName.receive}") private String receiveQueueName; /** MessageSource実装クラス */ @Autowired private MqSpringMessageSourceComponent messageSource; /** メッセージID取得繰り返し回数 */ private static final int LOOP_END = 8; /** * 主処理 *

* 電文定義マスタ読み込みエラーの場合
* サービス実行フラグにfalseを設定 * * @param args */ public static void main(String[] args) { logger = LogManager.getLogger(); context = SpringApplication.run(MqSpringApplication.class, args); jmsTemplate = context.getBean(JmsTemplate.class); if (context.getBean(TelegramInfoComponent.class).isTelegramInfoError()) { isProvidingService = false; } } /** * リクエスト受付処理 *

* サービス提供フラグがfalseの場合
* エラーログを出力する。 メッセージコンフィグ:SYS7010E
*  Httpステータス:503エラーを返す。
* それ以外の場合
*  Jsonのログ出力
*  リクエスト情報からタイムアウトを設定する。
* MQ送信サービスを宣言する。
* キューをセットし、メッセージ送信処理を呼び出す。
* ループ処理の中でメッセージIDを取得し、取得したらループから抜ける。
* メッセージIDがnullまたは空の場合
* エラーログを出力する。 メッセージコンフィグ:SYS7073E
*  Httpステータス:500エラーを返す。
* それ以外の場合
* メッセージ受信サービスからキューをセットし、メッセージIDを返す。 * * @param request リクエスト情報 * @return 返信レスポンス用モデルクラスのJSONデータ * @throws InterruptedException */ @RequestMapping(value = "/pgf/mq-rest/v1/apl/cda/reply", consumes = "application/json", produces = "application/json") String replyRequest(@RequestBody(required = false) ReplyRequestModel request) throws InterruptedException { if (!isProvidingService) { logger.error(messageSource.getMessage(MqSpringMessageId.SYS7010E)); throw new MqSpringException(MqSpringMessageId.SYS7010E, HttpStatus.SERVICE_UNAVAILABLE); } logger.info(request); // 受信待ち時間のタイムアウトを設定 jmsTemplate.setReceiveTimeout(Long.parseLong(request.getTimeout())); //jmsTemplate.setExplicitQosEnabled(true); //jmsTemplate.setTimeToLive(Long.parseLong(request.getTimeout())); MqSendService service = context.getBean(MqSendService.class); service.setQueue(sendQueueName); service.sendMqMessage(request); String id = null; int loopCnt = 0; while(loopCnt < LOOP_END) { Thread.sleep(50); id = service.getMessageId(); if (StringUtils.hasLength(id)) { break; } loopCnt++; } if (Objects.isNull(id) || id.isEmpty()) { logger.error(messageSource.getMessage(MqSpringMessageId.SYS7073E)); throw new MqSpringException(MqSpringMessageId.SYS7073E, HttpStatus.INTERNAL_SERVER_ERROR); } MqReceiveService receiveService = context.getBean(MqReceiveService.class); receiveService.setQueue(receiveQueueName); return receiveService.receiveMessage(id); } }