標準電文作成プログラム
プログラムの用途 | 実装するJavaインターフェース | 適用する設定画面 |
---|---|---|
ユーザー呼び出しプログラム | StandardCreateMessage | Base Setting Management > System Business Information |
内部で使用する標準電文を作成するプログラムである。
対外機関で入力される値のマッピングだけですべての値を作成できる場合は省略できるが、ほとんどの場合、機関で入力される共通部以外に追加のフィールド値を設定するため、一般的には開発して適用する。
標準電文を作成するケース
受信した電文のヘッダーと対内システムの標準電文ヘッダーが異なる場合
対外機関やチャネルから受信した電文で、対内システムの標準電文ヘッダーを作成できない場合、標準電文ヘッダーを作成するユーザープログラムで、標準電文ヘッダーを作成する。
一部の標準電文ヘッダーフィールドを作成する必要がある場合
対外機関やチャネルから受信した電文で、まずユーザープログラムで一部のフィールドを作成し、残りのフィールドはマッピングで標準電文ヘッダーを作成する。
マッピングで標準電文ヘッダーを作成する場合
対外機関やチャネルから受信した電文で、対内システムの標準電文ヘッダーをマッピングで作成する。
標準電文ヘッダーフィールドを検証する場合
対外機関やチャネルから受信した標準電文ヘッダーのフィールドを検証する場合にも使用する。
開発方法
提供されるインターフェースとして、下記4つのAPIがある。
要求のための標準電文を作成
下記の例は、対外機関やチャネルから受信した要求電文のヘッダーが、対内システムの標準電文ヘッダーと異なる場合に、新たに作成するケースである。
対外機関やチャネルから受信した電文が要求電文の場合、標準電文ヘッダーを作成する例であり、Nullを返すとエラー処理する。
@Override
public Map<String, Object> request(ExchangeMessage bxiMessage, Map<String, Object> extHeader,
BxiOnlineIntrfcIO onlIntrfcInfo) {
// 1. Generate a standard header map
Map<String, Object> stdHeader = new LinkedHashMap<String, Object>();
String guid = JavaUtil.createUid();
stdHeader.put("stdMsgLen", 344L);
stdHeader.put("stdMsgVer", 1L);
stdHeader.put("guid", guid);
stdHeader.put("guidSeq", 1L);
stdHeader.put("fstGuid", guid);
stdHeader.put("trtInstCd", extHeader.get("instCd"));
stdHeader.put("fstTrmsDttm", DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
stdHeader.put("msgClssCd", "S");
...
// 2. Store user data
Map<String, String> userData = new HashMap<String, String>();
userData.put("guid", (String) stdHeader.get("guid"));
userData.put("fstGuid", (String) stdHeader.get("fstGuid"));
bxiMessage.setUserData(userData);
// 3. Save layout information
XmlTypeInfo xmlInfo = LayoutUtil.makeXmlTypeInfo(STD_HDR_LAYOUT, 1024);
bxiMessage.setStdHeaderMsgInfo(xmlInfo);
return stdHeader;
}
標準電文ヘッダーを作成するためには、標準電文ヘッダーのレイアウトを知っておく必要がある。
標準電文ヘッダーの各フィールド別のデータをMap形式で保存する。
標準電文ヘッダー作成に必要な情報はbxiMessage
に保存されているため、これを利用して標準電文ヘッダーを作成する。
ユーザーデータは取引内訳やオンラインログ詳細画面で、ユーザーデータを検索する場合に使用するデータであり、userData
に保存すると、当該データを取引内訳や送受信ログに保存し、UIで検索する場合に使用することができる。
電文情報は、BXIエンジンでインターフェースを識別するために、電文から必要データを抽出する必要がある。 BXIは、電文データ抽出のために、WebAdminの共通ヘッダー情報にレイアウト別に登録して使用する。
ユーザーが直接標準電文ヘッダーを作成したため、当該電文の情報も標準電文ヘッダー情報であるstdHeaderMsgInfo
に保存する。
☑ 入力
- bxiMessage : 電文処理に必要な情報が保存されている項目
- extCommonHeader : 対外機関やチャネルから受信したヘッダーをUnmarshalしたデータ
- onlIntrfcInfo : 要求した取引のインターフェース情報
☑ 出力
- Map形式の標準電文ヘッダー
正常応答のための標準電文を作成
応答のための標準電文ヘッダー処理は、対内システムで、対外機関または単位システムに対してサービス要求し、応答を受ける場合に使用する。
要求時に、標準電文ヘッダーを保存しておき、応答を受け取った時に、これをリストアするために、標準電文ヘッダー全体を作成せず、リストアした要求ヘッダーから必要なフィールドだけを変更する。
応答に対する標準電文ヘッダー処理は、要求の際に標準電文で要求した場合に使用する。標準電文ヘッダーに要求/応答区分がある場合、または応答時間を設定する場合に使用する。
Nullを返すと、エラー処理する。
@Override
public Map<String, Object> response(ExchangeMessage bxiMessage, Map<String, Object> stdHeader,
Map<String, Object> extHeader) {
// 1. Change request / response breakdown to response
stdHeader.put("msgClssCd", "R");
return stdHeader;
}
☑ 入力
- bxiMessage : 電文処理に必要な情報が保存されている項目
- extCommonHeader : 対外機関やチャネルから受信したヘッダーをUnmarshalしたデータ
- onlIntrfcInfo : 要求した取引のインターフェース情報
☑ 出力
- Map形式の標準電文ヘッダー
Dummy応答のための標準電文ヘッダーを作成
対内システムのサービスが、要求サービスと応答サービスに分離されていて、対外機関に非同期方式で要求した場合、BXIは対外機関に電文を送信し、応答を受ける前に、先に対内システムにDummy応答を送信して、対内システムのサービスを解除する。
それ以降、実際の応答を受信した場合、他の要求と同じように、対内システムの応答サービスを呼び出す方式である。
このような方式で処理する理由は、対内システムサービスが、対外機関から応答を受けるまで待機することで発生する、システムの処理性能低下を防止するためである。 このような場合に、Dummy応答を作成するための例である。
@Override
public void dummyResponse(ExchangeMessage bxiMessage, BxiIntrnlSysBizIO intrnlSysBizInfo) {
// 1. Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2. Standard message header changes
// Response
stdHeader.put("msgClssCd", "R");
// Change response code
stdHeader.put("rspnRsltClssCd", "9");
// In case of dummy response, set guid sequence to "0"
stdHeader.put("guidSeq", "0");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3. Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4. Store dummy response message
bxiMessage.setMessage(responseMessage);
}
標準電文ヘッダーのフィールドのうち、Dummy応答を表すフィールドを変更する。
Dummy応答のために送信する電文は、APIで直接作成する必要がある。
Dummy応答は個別部を除いてヘッダー部だけで作成するため、body
データはClearする。
最後に作成されたDummy応答は、送信のためにExchangeMessageのmessage
に保存する。
☑ 入力
- bxiMessage : 電文処理に必要な情報が保存されている項目
- intrnlSysBizInfo : 要求した対内システムのシステム別業務情報
☑ 出力
- なし
応答電文伝送エラーによる標準電文ヘッダーを作成
対外機関に要求した電文を対内システムで処理し、応答を対外機関に送信する際に、送信するコネクションが切断したり、その他のエラーによって応答を送信できない場合に使用するAPIである。
この場合、標準電文ヘッダーに応答電文の伝送エラーというフラグを設定して伝達する。
@Override
public void sendErrorReply(ExchangeMessage bxiMessage) {
// 1. Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2. Set the response-specific transmission error flag
stdHeader.put("sendFlag", "E");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3. Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4. Store dummy response message
bxiMessage.setMessage(responseMessage);
}
応答に対するエラー返答も、Dummy応答と同じように、標準電文ヘッダーに応答電文の伝送エラーフラグを設定し、伝送データを作成する。 残りの処理についての説明は、Dummy応答電文作成APIを参考にする。
☑ 入力
- bxiMessage : 電文処理に必要な情報が保存されている項目
☑ 出力
- なし
全体例
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import bxi.api.StandardCreateMessage;
import bxi.common.dao.dto.BxiIntrnlSysBizIO;
import bxi.common.dao.dto.BxiOnlineIntrfcIO;
import bxi.common.model.ExchangeMessage;
import bxi.common.model.XmlTypeInfo;
import bxi.common.utility.DateUtil;
import bxi.common.utility.JavaUtil;
import bxi.common.utility.ObjectUtil;
import bxi.online.common.SendMessageCreator;
import bxi.parser.base.LayoutUtil;
@Component
public class BcFepStandardHeaderProcessor implements StandardCreateMessage {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final String STD_HDR_LAYOUT = "bxi.extension.layout.StdMsgHeader";
@Override
public Map<String, Object> request(ExchangeMessage bxiMessage, Map<String, Object> extHeader,
BxiOnlineIntrfcIO onlIntrfcInfo) {
// 1) Generate a standard header map
Map<String, Object> stdHeader = new LinkedHashMap<String, Object>();
String guid = JavaUtil.createUid();
stdHeader.put("stdMsgLen", 344L);
stdHeader.put("stdMsgVer", 1L);
stdHeader.put("guid", guid);
stdHeader.put("guidSeq", 1L);
stdHeader.put("fstGuid", guid);
stdHeader.put("trtInstCd", extHeader.get("instCd"));
stdHeader.put("fstTrmsDttm", DateUtil.getCurrentDate(DateUtil.EMPTY_MILL_DATE_TIME_TYPE).substring(0, 14));
stdHeader.put("msgClssCd", "S");
// 2) Store user data
Map<String, String> userData = new HashMap<String, String>();
userData.put("guid", (String) stdHeader.get("guid"));
userData.put("fstGuid", (String) stdHeader.get("fstGuid"));
bxiMessage.setUserData(userData);
// 3) Save layout information
XmlTypeInfo xmlInfo = LayoutUtil.makeXmlTypeInfo(STD_HDR_LAYOUT, 1024);
bxiMessage.setStdHeaderMsgInfo(xmlInfo);
return stdHeader;
}
@Override
public Map<String, Object> response(ExchangeMessage bxiMessage, Map<String, Object> stdHeader,
Map<String, Object> extHeader) {
// 1) Change request / response breakdown to response
stdHeader.put("msgClssCd", "R");
return stdHeader;
}
@Override
public void dummyResponse(ExchangeMessage bxiMessage, BxiIntrnlSysBizIO intrnlSysBizInfo) {
// 1) Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2) Standard message header changes
// Response
stdHeader.put("msgClssCd", "R");
// Change response code
stdHeader.put("rspnRsltClssCd", "9");
// In case of dummy response, set guid sequence to "0"
stdHeader.put("guidSeq", "0");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3) Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4) Store dummy response message
bxiMessage.setMessage(responseMessage);
}
@Override
public void sendErrorReply(ExchangeMessage bxiMessage) {
// 1) Check input data
if (ObjectUtil.isEmpty(bxiMessage)) {
return;
}
Map<String, Object> stdHeader = bxiMessage.getStdHeader();
if (ObjectUtil.isEmpty(stdHeader)) {
return;
}
// 2) Set the response-specific transmission error flag
stdHeader.put("sendFlag", "E");
// The common header and body are null. Because it only sends standard message.
bxiMessage.setComHeader(null);
bxiMessage.setBody(null);
// 3) Generate send message
byte[] responseMessage = SendMessageCreator.makeSendMessageToInternal(
intrnlSysBizInfo.getChlMsgTypeCd(), intrnlSysBizInfo.getMsgCharSetCd(),
intrnlSysBizInfo.getExtrnlComInclYn(), bxiMessage);
// 4) Store dummy response message
bxiMessage.setMessage(responseMessage);
}
}