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

Bx Client

Bx Clientは電文を生成してHTTP取引を要求するモジュールです。

必要要素

本モジュールを使用するために必要なファイルは、下記のとおりである。

ファイル名説明
bxi.client.jarcallEaiメソッドを含んでいるライブラリファイル
bxiClient.yml電文を作成するためのヘッダー情報とurlリストがあるファイル
log4j2.xmlロギング処理のための設定ファイル
etcbxi.client.jarが動作するための3rd Partyライブラリファイル

環境設定

本モジュールを実行するためには、bxiClient.yml設定が必要である。また、log4j2.xmlファイルを指定しなければログが残らないため、設定を推奨する。

1. bxiClient.yml設定

bxi.client.jarを実行する際に-Dbxi.clientYml={ファイルパス}/bxi.client.ymlオプションを追加する。

bxiClient.yml
header:
stdMsgLen:
stdMsgVer:
guid: 2
guidSeq:
fstGuid:
trtInstCd:
msgClssCd: 3
itfcId: 1
errCd:
name:
header.root.element.name: "EduSystemHeader"
body.root.element.name: "APtoDBreq"
url:
- "http://123.123.123.44:32310"
- "http://123.123.123.44:14382/eai"
- "http://123.123.123.44:13020"
  • header : eaiに登録された標準電文ヘッダーのレイアウト、およびそのレイアウトの中の入力してもらいたい順序を意味する。 例えば、標準電文ヘッダーには、stdMsgLen、stdMsgVer…errCdなどの項目が定義されているが、そのうちitfcId、guid、msgClssCdのみ順序を入力値として与えることができる。 数字は順序を示すため重複してはならない。
  • name : header.root.element.nameはヘッダーのルートエレメント名を意味し、body.root.element.nameはボディのルートエレメント名を意味する。 ymlファイルのエレメント名を使用せず、callEaiを呼び出す時にパラメータに入れて指定することもできる。
  • url : 要求するendpoint urlを意味する。リストに指定する必要があり、Round Robin方式で順序に負荷を分散する。

当該値は動的に変更できる。 例えば、urlポートを変更すると、次の要求からは変更したポートでHTTPを要求する。

caution

上位「header」、「name」、「url」の名称は変更しない。

2. log4j2.xml設定

bxi.client.jarを実行する際に-Dlog4j.configurationFile={ファイルパス}/log4j2.xmlオプションを追加する。

使い方

本モジュールをcallEai()メソッドを呼び出すことで使用できる。

☑ Mapでヘッダー情報を伝達しながら、ymlファイルのエレメント名を使用する場合の例

Map<String, Object> headerMap = new HashMap<>();
headerMap.put("itfcId", "AP_TO_DB_INTERFACE03");
headerMap.put("guid", "3d321690fbb145f993780bc51d9f2c59");
headerMap.put("msgClssCd", "S");

Map<String, Object> resultMap = BxiHttpSender.callEai(bodyMap, headerMap);
if (resultMap != null) {
// TODO : 正常処理。ヘッダー・ボディ抽出可能
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : エラー処理(404、500などで応答メッセージを受け取れない状況)。サイト別にカスタマイズ必須
Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements); // yml情報を読み込んでヘッダーを作成してくれるメソッド
header.put("errCd", "ERROR");
...
}

☑ Mapでヘッダー情報を伝達しながら、エレメント名を直接伝達する例

Map<String, Object> headerMap = new HashMap<>();
headerMap.put("itfcId", "AP_TO_DB_INTERFACE03");
headerMap.put("guid", "3d321690fbb145f993780bc51d9f2c59");
headerMap.put("msgClssCd", "S");

Map<String, Object> resultMap = BxiHttpSender.callEai("ボディ名", bodyMap, "ヘッダー名", headerMap);
if (resultMap != null) {
// TODO : 正常処理。ヘッダー・ボディ抽出可能
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : エラー処理(404、500などで応答メッセージを受け取れない状況)。サイト別にカスタマイズ必須
Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements); // yml情報を読み込んでヘッダーを作成してくれるメソッド
header.put("errCd", "ERROR");
...
}

☑ Objectでヘッダー情報を伝達しながら、エレメント名を直接伝達する例

Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> resultMap = BxiHttpSender.callEai("ボディ名", bodyMap, "ヘッダー名", headerElements);
if (resultMap != null) {
// TODO : 正常処理。ヘッダー・ボディ抽出可能
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : エラー処理(404、500などで応答メッセージを受け取れない状況)。サイト別にカスタマイズ必須
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements);
header.put("errCd", "ERROR");
...
}

☑ Objectでヘッダー情報を伝達しながら、ymlファイルのエレメント名を使用する例

Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> resultMap = BxiHttpSender.callEai(bodyMap, headerElements);
if (resultMap != null) {
// TODO : 正常処理。ヘッダー・ボディ抽出可能
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : エラー処理(404、500などで応答メッセージを受け取れない状況)。サイト別にカスタマイズ必須
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements);
header.put("errCd", "ERROR");
...
}

☑ Wrapperで包む例

class BxiClientWrapper {
public Map<String, Object> callEai(Map<String, Object> bodyMap, String intrfcId, String msgClssCd) {
return BxiHttpSender.callEai(bodyMap, new Object[] { intrfcId, makeGuid(), msgClssCd });
}

// TODO : サイト別GUIDの作成
public String makeGuid() {
return "3d321690fbb145f993780bc51d9f2c59";
}
}

BxiClientWrapper wrapper = new BxiClientWrapper();
Map<String, Object> resultMap = wrapper.callEai(bodyMap, "AP_TO_DB_INTERFACE03", "S");
if (resultMap != null) {
// TODO : 正常処理。ヘッダー・ボディ抽出可能
Map<String, Object> header = (Map<String, Object>) resultMap.get("EduSystemHeader");
Map<String, Object> body = (Map<String, Object>) resultMap.get("data"))
...
} else {
// TODO : エラー処理(404、500などで応答メッセージを受け取れない状況)。サイト別にカスタマイズ必須
Object[] headerElements = { "AP_TO_DB_INTERFACE03", "3d321690fbb145f993780bc51d9f2c59", "S" };
Map<String, Object> header = BxiClientUtils.getHeaderMap(headerElements);
header.put("errCd", "ERROR");
...
}

上の例のように、callEai()を呼び出した時、EAIに要求する電文は下記のとおりである

url : http://123.123.123.44:32310
body : {
"EduSystemHeader":{
"msgClssCd":"S",
"guid":"3d321690fbb145f993780bc51d9f2c59",
"itfcId":"AP_TO_DB_INTERFACE03"
},
"APtoDBreq":{
"password":"123",
"name":"abc",
"id":"9999"
}
// エレメント名をymlファイルから読み込まずに直接パラメーターに入れた時は、以下のとおりである。
body : {
"ヘッダー名":{
"msgClssCd":"S",
"guid":"3d321690fbb145f993780bc51d9f2c59",
"itfcId":"AP_TO_DB_INTERFACE03"
},
"ボディ名":{
"password":"123",
"name":"abc",
"id":"9999"
}
}

もう一度呼び出した時、urlはRound Robin方式で下記のurlにhttpを要求する

url : http://123.123.123.44:14382/eai
body : {
"EduSystemHeader":{
"msgClssCd":"S",
"guid":"3d321690fbb145f993780bc51d9f2c59",
"itfcId":"AP_TO_DB_INTERFACE03"
},
"APtoDBreq":{
"password":"123",
"name":"abc",
"id":"9999"
}
}