
Die Interface-Pattern Zustandslos (XI 3.0-kompatibel), Zustandslos, Zustandsbehaftet und TU&C/C weisen für jedes Service-Interface die Art der durchzuführenden Kommunikation zu.
Ein TU&C/C-Szenario (Tentative Update and Compensate or Confirm) könnte folgendermaßen aussehen:
Der Consumer schickt Requests 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 Operation, welche die Änderungen bestätigt, wenn zum Beispiel eine Bestellung definitiv vorgenommen wurde, und eine Operation, die das Rollback veranlasst, wenn eine Änderung nicht bestätigt wurde. 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.
Sie haben ein Proxy generiert (siehe auch Consumer-Proxy generieren).
Sie haben das Consumer-Proxy konfiguriert.
Weitere Informationen hierzu finden Sie im Abschnitt 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.