/* * 著作権表記 TODO 要否をお客様に確認 */ package com.pgf.mqspring; import java.io.IOException; import java.text.MessageFormat; 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.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.view.RedirectView; 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.model.TestModel; 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; /** メッセージの受信処理URLフォーマット */ private static final String RECV_MESSAGE_URL_FORMAT = "/recvMessage?id={0}"; /** * 主処理 *

* 電文定義マスタ読み込みエラーの場合
* サービス実行フラグに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; } } // TODO ITa後削除対象(テスト時の問題切り分け用) @RequestMapping("/pgf/mq-rest/v1/apl/cda/sendRawData") RedirectView sendRawData(@RequestBody TestModel testModel) throws IOException, InterruptedException { MqSendService service = context.getBean(MqSendService.class); service.setQueue("QR.MDH01.IN"); String ret = service.sendRawData(testModel); if (!"200".equals(ret)) { logger.error(messageSource.getMessage(MqSpringMessageId.SYS7005E)); return new RedirectView("/send-ng"); } Thread.sleep(1000); String id = service.getMessageId(); if (Objects.isNull(id) || id.isEmpty()) { return new RedirectView("/send-ng"); } logger.info("[After 1000m Sleep] MessageID=" + id); return new RedirectView("/recvMessage?id=" + id); } /** * リクエスト受付処理 *

* サービス提供フラグがfalseの場合
* エラーログを出力する。 メッセージコンフィグ:SYS7010E
*  Httpステータス:503エラーを返す。
* それ以外の場合
*  リクエスト情報からタイムアウトを設定する。
* MQ送信サービスを宣言する。
* キューをセットし、メッセージ送信処理を呼び出す。
* メッセージIDを取得する。
* メッセージIDがnullまたは空の場合
* エラーログを出力する。 メッセージコンフィグ:SYS7073E
*  Httpステータス:500エラーを返す。
* それ以外の場合
* 送信処理より取得したメッセージIDwをパラメータとし、メッセージ受信処理にリダイレクトする。 * * @param request リクエスト情報 * @return RedirectView {@link #RedirectView(String url)} * @throws InterruptedException */ @RequestMapping(value = "/pgf/mq-rest/v1/apl/cda/reply", consumes = "application/json", produces = "application/json") RedirectView replyRequest(@RequestBody(required = false) ReplyRequestModel request) throws InterruptedException { if (!isProvidingService) { logger.error(messageSource.getMessage(MqSpringMessageId.SYS7010E)); throw new MqSpringException(MqSpringMessageId.SYS7010E, HttpStatus.SERVICE_UNAVAILABLE); } // 受信待ち時間のタイムアウトを設定 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); Thread.sleep(1000); String id = service.getMessageId(); if (Objects.isNull(id) || id.isEmpty()) { logger.error(messageSource.getMessage(MqSpringMessageId.SYS7073E)); throw new MqSpringException(MqSpringMessageId.SYS7073E, HttpStatus.INTERNAL_SERVER_ERROR); } return new RedirectView(MessageFormat.format(RECV_MESSAGE_URL_FORMAT, id)); } /** * メッセージの受信処理 *

* 送信済みメッセージIDの長さが0以上の場合
* 受信したメッセージを返す
* それ以外の場合
* エラーログを出力する。 メッセージコンフィグ:SYS7073E
* Internal Server Error(500エラー)を返す。 * @param id * @return 500 */ @RequestMapping("/recvMessage") String recvMessage(@RequestParam(name = "id") String id) { MqReceiveService service = context.getBean(MqReceiveService.class); service.setQueue(receiveQueueName); if (id.length() > 0) { return service.receiveMessage(id); } logger.error(messageSource.getMessage(MqSpringMessageId.SYS7073E)); throw new MqSpringException(MqSpringMessageId.SYS7073E, HttpStatus.INTERNAL_SERVER_ERROR); } // TODO ITa後削除対象(テスト時の問題切り分け用) /** * エラー時のリダイレクト処理 *

* Internal Server Error(500エラー)を返す。 * * @return  */ @RequestMapping("send-ng") String sendNg() { return "500"; } }