エラー応答プログラム
プログラムの用途 | 実装するJavaインターフェース | 適用する設定画面 |
---|---|---|
ユーザー呼び出しプログラム | ErrorResponseCreate | Base Setting Management>Institutional Business Information、Base Setting Management>System Business Information |
受信システムの障害などで、要求電文を受信システムに送信できない場合、当該取引は無応答(Timeout)処理される。
もし、送信システムに、エラー応答電文を送信する必要がある場合、エラー応答プログラムでエラー電文を作成して、送信システムに応答を送信することができる。
開発方法
対外機関や対内システムのエラー応答電文が異なる場合、別途作成して、それぞれ登録する必要がある。
エラー応答プログラムの入出力モデル
ErrorResponseCreate APIは、入力と出力として、それぞれErrorResponseCreateIn
とErrorResponseCreateOut
を使用する。入力と出力のモデルは、APIプロジェクトのbxi.api.model
に定義されており、それぞれの項目についての説明は、下記のとおりである。
ErrorResponseCreateIn
設定項目 | フィールド名 | 説明 |
---|---|---|
機関コード | instCd | 電文を送信した機関コード、または対内システム電文を対外機関に送信する機関コードを意味する。FEPでのみ使用される項目である。 |
業務コード | bizCd | 機関や対内システムの業務コードを意味する。 |
コネクションID | cnntId | 電文を受信したコネクションの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;
}
}