TU&C/C-Web-Service konsumieren
Die Interface-Pattern zustandslos (XI 3.0 kompatibel), zustandslos, zustandsbehaftet und TU&C/C weisen jedem Service-Interface die Art der auszuführenden Kommunikation zu.
Ein TU&C/C-Szenario (Tentative Update and Compensate or Confirm) könnte aus Sicht einer betriebswirtschaftlichen Anwendung folgendermaßen aussehen:
Der Consumer schickt seine Aufträge an den Server. Dieser führt die Änderungen in seinem System vorläufig aus. Erst wenn auf der Client-Seite zum Beispiel eine Bestellung definitiv vorgenommen wurde, werden die Änderungen persistiert. Bei einem Fehler werden die Änderungen zurückgerollt. Diese Art der Kommunikation erfordert spezielle Vorgehensweisen in der Anwendung.
Bei einem TUCC-Szenario sind mehrere Operationen nötig. Mindestens eine Operation, die Änderungen im Zielsystem vornimmt, eine die die Änderungen bestätigt, wenn zum Beispiel eine Bestellung definitiv vorgenommen wurde und eine die das Rollback veranlasst, sollte eine Änderung nicht bestätigt worden sein. Zuvor kann eine Operation ausgeführt werden, die keinerlei Änderungen im Zielsystem vornimmt, sondern beispielsweise nur Werte liest.
Weitere Informationen erhalten Sie unter Tentative Update & Confirm / Compensate (TU&C/C) im Abschnitt Interface-Pattern in der Dokumentation zum ES Repository.
● Sie haben ein Proxy generiert (siehe:Consumer-Proxy generieren).
● Sie haben das Consumer-Proxy konfiguriert.
Weitere Informationen hierzu finden Sie im Abschnitt Configuring Web Service Clients im NetWeaver Administrator und Consumer-Proxy konfigurieren im SOA Manager.
● Ihrem Benutzerstammsatz wurde die Rolle SAP_BC_WEBSERVICE_CONSUMER zugeordnet (siehe: Berechtigungen).
...
Legen Sie ein Programm an, um einen Service mit dem Interface-Pattern TU&C/C aufzurufen.
Beispiel
DATA: l_proxy TYPE REF TO
my_proxy_class,
l_seq_prot TYPE
REF TO if_wsprotocol_sequence,
l_seq_comp TYPE
REF TO if_ws_client_sequence,
l_seq_conf TYPE
REF TO if_ws_client_sequence,
l_lp_name
TYPE prx_logical_port_name,
l_tucc_id
TYPE sysuuid_x16,
l_output_comp TYPE my_comp_req_struct,
l_output_m1 TYPE
my_m1_req_struct,
l_output_m2 TYPE
my_m2_req_struct,
l_output_conf TYPE my_conf_req_struct,
l_input_m1 TYPE
my_m1_resp_struct,
l_input_m2 TYPE
my_m2_resp_struct.
TRY.
* determine logical port:
l_lp_name = ...
* create proxy object:
CREATE OBJECT
l_proxy
EXPORTING
logical_port_name = l_lp_name.
* get sequence
protocol:
l_seq_prot ?=
l_proxy->get_protocol( if_wsprotocol=>sequence ).
* create TU&C/C ID:
l_tucc_id =
cl_system_uuid=>if_system_uuid_static~create_uuid_x16( ).
* register compensate
method for reliable execution
* if the LUW
fails (rollback, dump, shutdown). This needs to be done
* before sending any other messages of the LUW, as a shutdown
* could happen at any time:
l_seq_comp =
l_seq_prot->create_transient_sequence( on_failure = 'X' ).
l_seq_comp->begin(
).
l_seq_prot->set_client_sequence( l_seq_comp ).
l_output_comp-my_comp_req_struct-id = l_tucc_id.
l_proxy->compensate( output = l_output_comp ).
l_seq_comp->end(
).
* call synchronous
methods:
l_output_m1-my_m1_req_struct-id = l_tucc_id.
l_output_m1-... =
...
l_proxy->method1(
EXPORTING output = l_output_m1
IMPORTING input =
l_input_m1 ).
...
l_output_m2-my_m2_req_struct-id = l_tucc_id.
l_output_m2-... =
...
l_proxy->method2(
EXPORTING output = l_output_m2
IMPORTING input =
l_input_m2 ).
...
* register confirm method
for reliable execution if the
* LUW succeeds (commit):
l_seq_conf =
l_seq_prot->create_transient_sequence( ).
l_seq_conf->begin(
).
l_seq_prot->set_client_sequence( l_seq_conf ).
l_output_conf-my_conf_req_struct-id = l_tucc_id.
l_proxy->confirm(
output = l_output_conf ).
l_seq_conf->end(
).
* success, commit the
LUW:
COMMIT WORK.
CATCH cx_root.
* failure, rollback of
LUW:
ROLLBACK
WORK.
ENDTRY.
Weitere Informationen finden Sie unter Programmieren mit Sequenzen.