/* * 著作権表記 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"; } }