メインコンテンツまでスキップ

エラー応答プログラム

プログラムの用途実装するJavaインターフェース適用する設定画面
ユーザー呼び出しプログラムErrorResponseCreateBase Setting Management>Institutional Business Information、Base Setting Management>System Business Information

受信システムの障害などで、要求電文を受信システムに送信できない場合、当該取引は無応答(Timeout)処理される。

もし、送信システムに、エラー応答電文を送信する必要がある場合、エラー応答プログラムでエラー電文を作成して、送信システムに応答を送信することができる。

開発方法

対外機関や対内システムのエラー応答電文が異なる場合、別途作成して、それぞれ登録する必要がある。

エラー応答プログラムの入出力モデル

ErrorResponseCreate APIは、入力と出力として、それぞれErrorResponseCreateInErrorResponseCreateOutを使用する。入力と出力のモデルは、APIプロジェクトのbxi.api.modelに定義されており、それぞれの項目についての説明は、下記のとおりである。

ErrorResponseCreateIn

設定項目フィールド名説明
機関コードinstCd電文を送信した機関コード、または対内システム電文を対外機関に送信する機関コードを意味する。FEPでのみ使用される項目である。
業務コードbizCd機関や対内システムの業務コードを意味する。
コネクションIDcnntId電文を受信したコネクションのIDを意味する。
ヘッダー部データheader要求や応答で受信した電文のうち、ヘッダー部をUnmarshalしたデータを意味する。
個別部データbody要求や応答で受信した電文のうち、個別部データを意味する。個別部データは、インターフェース情報にレイアウトを登録してUnmarshalになればMap形式であり、そうでなければPlain textデータである。
応答スコードrspsCd対外チャネルや対内チャネルに伝送するエラーコードを意味する。
タイムアウトであるかどうかtimeoutタイムアウトエラーであるかどうかを意味する。タイムアウトエラーの場合、trueである。
伝送エラーであるかどうかsendError電文伝送エラーであるかどうかを意味する。電文伝送エラーの場合、trueである。

ErrorResponseCreateOut

設定項目フィールド名説明
ヘッダー部データheaderエラー応答するヘッダー部データを意味する。入力で伝達したヘッダー部データにエラーであるかどうかやエラーコードを保存したデータを意味する。
メッセージ部データerrMessageチャネルにエラー応答するメッセージを保存したデータを意味する。MCI、EAIでのみ使用される項目であり、FEPではnullと応答する。
個別部データbodyエラー応答する個別部データを意味する。応答する個別部データがない場合、nullと応答する。
エラーであるかどうかerrorエラー応答電文作成中にエラーが発生したかどうかを意味する。trueと応答すると、エラー応答電文を送信しない。

下記の例は、対外機関から受信した電文を処理するプロセスでエラーが発生してエラー応答する例である。

1.出力オブジェクト作成および初期化

@Override
public ErrorResponseCreateOut errorProcess(ErrorResponseCreateIn in) {
ErrorResponseCreateOut out = new ErrorResponseCreateOut();
out.setError(false);
out.setRspsCd("000");
}

エラー応答電文を作成して送信する出力オブジェクトを作成し、エラーレート電文作成中に発生するエラーであるかどうかはclearする。

2.種別コードを求める

String msgCbtpCd = null;
try {
msgCbtpCd = (String) header.get("msgCbtpCd");
} catch (IllegalArgumentException ex) {
out.setError(true);
return out;
}

if (StringUtil.isEmpty(msgCbtpCd)) {
out.setError(true);
return out;
}

対外機関の電文は一般的に種別コードで要求と応答を区分する。

エラー応答電文作成は、種別コードを求めて種別コードを応答電文コードに変更する必要があるため、種別コードがなければエラー処理する。 上記の例は、種別コードの要求と応答を区分するが、場合によって様々な項目を通じて区分することもできる。

3.エラーコードを保存

// Generate error response message
out.setHeader(in.getHeader());

byte[] value = msgCbtpCd.getBytes();
value[2] = '1';
msgCbtpCd = new String(value);
out.getHeader().put("msgCbtpCd", msgCbtpCd);

if (in.isTimeout()) {
out.getHeader().put("rspsCd", "01");
} else if (in.isSendError()) {
out.getHeader().put("rspsCd", "02");
} else {
out.getHeader().put("rspsCd", in.getRspsCd());
}

入力で送信したヘッダーを出力のヘッダーに保存し、種別コードを応答コードに変更して応答ヘッダーを変更する。

ヘッダーの応答コードには、エラーの種類によるエラーコードを保存する。 上記の例は、要求・応答を区分する種別コードや応答コードフィールドがヘッダー部にある場合である。

もし、個別部にエラー情報があれば、ヘッダー部で行った方式のように、エラー情報を作成してbodyに保存する。

全体例

import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import bxi.api.ErrorResponseCreate;
import bxi.api.model.ErrorResponseCreateIn;
import bxi.api.model.ErrorResponseCreateOut;
import bxi.common.utility.StringUtil;

@Component
public class ErrorMessageCreate implements ErrorResponseCreate {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Override
public ErrorResponseCreateOut errorProcess(ErrorResponseCreateIn in) {
ErrorResponseCreateOut out = new ErrorResponseCreateOut();
out.setError(false);
out.setRspsCd("000");

// Lookup category code
String msgCbtpCd = getKindCode(in.getHeader());
if (StringUtil.isEmpty(msgCbtpCd)) {
out.setError(true);
return out;
}

// Generate error response message
out.setHeader(in.getHeader());
byte[] value = msgCbtpCd.getBytes();
value[2] = '1';
msgCbtpCd = new String(value);
out.getHeader().put("msgCbtpCd", msgCbtpCd);
if (in.isTimeout()) {
out.getHeader().put("rspsCd", "01");
} else if (in.isSendError()) {
out.getHeader().put("rspsCd", "02");
} else {
out.getHeader().put("rspsCd", in.getRspsCd());
}

if (logger.isDebugEnabled()) {
logger.debug("msgCbtpCd: {}", msgCbtpCd);
logger.debug("rspsCd: {}", out.getHeader().get("rspsCd"));
}

return out;
}

/**
* Lookup category code from the header
*
* @param header
* @return
*/
private String getKindCode(Map<String, Object> header) {
String msgCbtpCd = null;
try {
msgCbtpCd = (String) header.get("msgCbtpCd");
} catch (IllegalArgumentException ex) {
return null;
}
if (StringUtil.isEmpty(msgCbtpCd)) {
return null;
}

return msgCbtpCd;
}
}