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