使用する
LDQ APIを使用したユニットの読み取り(「読み取り」)と初期確認および予測
キューの特定のテーブルを読み取るために、キューごとにリーダーオブジェクトとユニットリーダーオブジェクトが作成されます。キューごとに、ユニットは10個のブロックで読み取られ、ユニットのサイズを含む状態情報のみが抽出されます。指定されたu_sizeに達するとすぐに、前のシナリオと同様に、対応するユニットの内容が読み取られ、ペイロードが抽出されます。その後、読み取りユニットはデータベースから削除(確認)されます。
シーケンス図:
下書き:
a)入力パラメータ:
ap_name TYPE ldq_application_name DEFAULT’Perf_TEST’、
qp_name TYPE ldq_queue_name DEFAULT’LDQ_TEST_’、
n_queues TYPE i DEFAULT 5、
n_times TYPE i DEFAULT 1、
u_size TYPE iDEFAULT2。
last_received_seq_nrTYPEldq_unit_id。
b)宣言:
データ:l_ldq_reader TYPE REF TO if_ldq_reader、
l_ldq_unit_reader TYPE REFTOif_ldq_unit_reader。
データ:l_queue_name_tab TYPE ldq_queue_name_tab、
l_queue_nameTYPEldq_queue_name。
データ:l_xdata TYPE xstring、
l_cdataTYPE文字列。
データ:l_sizeTYPEi。
データ:l_content_tabタイプldq_unit_content_reader_tab。
データ:l_state_tabタイプldq_unit_state_reader_tab。
データ:l_delTYPEi。
データ:l_seq nrTYPEldq_unit_id。
データ:l_queue_nr(4)タイプn。
データ:l_linesTYPEi。
データ:l_last_linesタイプi。
データ:l_unitTYPEi。
データ:l_state_wa TYPE REF TO if_ldq_unit_state_reader、
l_content_wa TYPE REFTOif_ldq_unit_content_reader。
データ:l_formatTYPEldq_data_format。
データ:l_next_state_nrタイプi。
データ:l_next_content_nrタイプi。
データ:l_numberタイプi。
フィールドシンボル:<l_content_wa>if_ldq_unit_content_readerへのタイプ参照。
フィールドシンボル:<l_state_wa> TYPE REFTOif_ldq_unit_state_reader。
*
c)キュー名の作成:
*
クリア:l_queue_name_tab []、l_content_tab[]。
n_queuesTIMESを実行します。
l_queue_nr=sy-index。
qp_name l_queue_nrINTOl_queue_nameを連結します。
CONDENSEl_queue_nameNO-GAPS。
l_queue_nameをl_queue_name_tabに追加します。
ENDDO。
u_size = u_size*1000。”キロバイト単位
l_queue_name_tabをl_queue_nameにループします。
*
d)LDQアプリケーションオブジェクトの作成:
*
l_ldq_reader = cl_ldq_application => get_reader(ap_name)。
e)指定されたシーケンス番号までの前のセッションからの読み取りユニットを確認します。
*
l_ldq_reader-> confirm_queue_units(l_queue_name、last_received_seq_nr)。
*注:このメソッドは暗黙的なコミットを実行します。
*
f)ユニットを取得するためのキュー名の初期化:
*
l_ldq_unit_reader = l_ldq_reader-> set_queue_name(l_queue_name)。
n_times回実行します。“n_readTIMES。
g)u_sizeに収まる数のユニットを取得します。
*
l_next_state_nr = l_lines=0。
行う。
l_next_state_nr = l_next_state_nr+10。
l_state_tab = l_ldq_unit_reader-> get_next_states(l_next_state_nr)。
l_last_lines = LINES(l_state_tab)。
l_lines>=l_last_linesの場合。
*必要なu_sizeに到達するのに十分なデータベース上のユニットがありません
*したがって、既存のものを使用してください
l_next_content_nr=l_lines。
出口。
そうしないと。
l_lines=l_last_lines。
ENDIF。
l_size=0。
l_state_tabASSIGNING<l_state_wa>でループします。
l_size = l_size + <l_state_wa>-> get_size()。
l_size>=u_sizeの場合。
l_next_content_nr=sy-tabix。
出口。
ENDIF。
ENDLOOP。
l_size<u_sizeの場合。
継続する。
そうしないと。
*要求されたサイズに達しました
出口。
ENDIF。
ENDDO。
*
h)キューから(最大)l_next_content_nrコンテンツ、つまりユニット状態とそのペイロードを取得します。
*
l_content_tab = l_ldq_unit_reader-> get_next_contents(l_next_content_nr)。
l_unit = LINES(l_content_tab)。
i)コンテンツオブジェクトから含まれる情報を取得します。
*
l_number = l_number+1。
書き込み:/ l_number、’Qname:’、l_queue_name、’ユニット番号:’、l_unit。
l_content_tabASSIGNING<l_content_wa>でループします。
l_format = <l_content_wa>-> get_format()。
IF cl_ldq_unit_writer => co_character_data_type=l_format。
l_cdata = <l_content_wa>-> get_cdata()。
そうしないと。
l_xdata = <l_content_wa>-> get_xdata()。
ENDIF。
l_sequence number = <l_content_wa>-> get_sequence_number()。
l_size = <l_content_wa>-> get_size()。
書き込み:/ 13’シーケンス番号:’、l_seq_nr、’サイズ:’、l_size。
ENDLOOP。
i)LDQデータの読み取りステータスをデータベースに永続化します。
仕事をコミットします。
ENDDO。
ENDLOOP。