public class MessageResendHandler extends java.lang.Object implements Handler<RequestMessage,ResponseMessage>
1. ネットワークエラーもしくは遅延により、初回電文が未受信。
2. 初回電文を処理中。
3. 初回電文に対する業務処理は正常終了(トランザクションをコミット)したが、
ネットワークエラーもしくは遅延により応答電文が未達。
4. 初回電文に対する業務処理が異常終了(トランザクションをロールバック)し、
ネットワークエラーもしくは遅延によりエラー応答電文が未達。
それぞれのケースについて、本システムの挙動は以下のようになる。
1. 初回電文が未受信
再送要求電文を初回電文として処理する。
この場合、再送要求電文を処理中に、遅延していた初回電文を並行実行する可能性があるが
先にコミットされたトランザクションのみ正常終了し、それ以外はロールバックする。
また、ロールバックされた要求の応答として、先に正常終了した電文の応答を再送する。
2. 本システムで初回電文を処理中
再送要求電文も初回電文として処理し、先に完了したトランザクションをコミットし、
もう一方をロールバックする。
(1.と同じ扱い。)
3. 業務処理は正常終了したが応答電文が未達
再送用電文テーブルから当該メッセージIDの電文データを取得し、応答電文として送信する。
業務処理は実行されない。
4. 業務処理が正常終了したがエラー応答電文が未達
再送要求電文を初回電文として処理する。
本機能は大きく以下の2つの機能によって構成されている。
再送応答機能:
接続先システムから再送要求電文が送信された場合に、
後述の送信済電文保存機能が保持する過去の応答電文の内容を再送信する機能。
送信済電文保存機能:
ローカルキューに対するPUT命令が完了したメッセージの内容をデータベース上の
送信済電文テーブルに保存する機能。
送信済み電文の内容は業務トランザクションとともにコミットされる。
従って、業務処理がエラー終了した場合には再送用電文は残らない。
再送電文管理テーブルのスキーマ構造については SentMessageTableSchema
を参照すること。
| コンストラクタと説明 |
|---|
MessageResendHandler()
デフォルトコンストラクタ。
|
| 修飾子とタイプ | メソッドと説明 |
|---|---|
SqlRow |
findAlreadySentMessage(java.lang.String messageId,
java.lang.String requestId)
再送対象の電文レコードを検索し、当該の電文のレコードを返却する。
|
ResponseMessage |
getAlreadySentReply(RequestMessage request)
再送電文テーブルの内容を確認し、メッセージIDが一致する電文があれば
その内容をもとに応答電文を作成して返す
該当する電文が存在しなければnullを返す。
|
ResponseMessage |
handle(RequestMessage request,
ExecutionContext context)
入力データに対する処理を実行する。
|
void |
initialize()
本ハンドラで使用するSQL文を構築する。
|
void |
insertNewSentMessage(java.util.Map<java.lang.String,java.lang.Object> values)
再送電文管理テーブルに送信電文を新規登録する。
|
void |
saveReply(RequestMessage request,
ResponseMessage response)
応答電文を再送電文テーブルに格納する。
|
MessageResendHandler |
setFwHeaderDefinition(FwHeaderDefinition def)
応答電文中のフレームワーク制御ヘッダ定義を設定する。
|
MessageResendHandler |
setSentMessageTableSchema(SentMessageTableSchema schema)
再送電文管理テーブルのスキーマ定義を設定する。
|
public void initialize()
public ResponseMessage handle(RequestMessage request, ExecutionContext context)
handle インタフェース内 Handler<RequestMessage,ResponseMessage>request - 入力データcontext - 実行コンテキストpublic void saveReply(RequestMessage request, ResponseMessage response)
request - 要求電文オブジェクトresponse - 応答電文オブジェクトpublic void insertNewSentMessage(java.util.Map<java.lang.String,java.lang.Object> values)
values - 登録するレコードpublic ResponseMessage getAlreadySentReply(RequestMessage request)
request - 要求電文オブジェクトpublic SqlRow findAlreadySentMessage(java.lang.String messageId, java.lang.String requestId)
messageId - 初回電文のメッセージID (=再送要求電文の関連ID)requestId - 要求電文のリクエストIDpublic MessageResendHandler setSentMessageTableSchema(SentMessageTableSchema schema)
schema - スキーマ定義public MessageResendHandler setFwHeaderDefinition(FwHeaderDefinition def)
def - フレームワーク制御ヘッダ定義