Bx Client
Bx Clientは電文を生成してHTTP取引を要求するモジュールです。
必要要素
本モジュールを使用するために必要なファイルは、下記のとおりである。
ファイル名 | 説明 |
---|---|
bxi.client.jar | callEaiメソッドを含んでいるライブラリファイル |
bxiClient.yml | 電文を作成するためのヘッダー情報とurlリストがあるファイル |
log4j2.xml | ロギング処理のための設定ファイル |
etc | bxi.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"
}
}