ABAP Keyword Documentation → ABAP − Reference → Creating Objects and Values → Shared Objects
This example demonstrates the use of shared objects.
7.31 | 7.40 | 7.54
REPORT demo_shared_objects. CLASS demo_flight_list_handler DEFINITION FINAL CREATE PRIVATE. PUBLIC SECTION. CLASS-DATA flight_list_handler TYPE REF TO demo_flight_list_handler. CLASS-METHODS class_constructor. METHODS get_flight_list RETURNING VALUE(flights) TYPE REF TO spfli_tab RAISING cx_no_flights. PRIVATE SECTION. DATA area_handle TYPE REF TO cl_demo_flights. METHODS create_flight_list RAISING cx_shm_attach_error cx_no_flights. ENDCLASS. CLASS demo_flight_list_handler IMPLEMENTATION. METHOD class_constructor. CREATE OBJECT flight_list_handler. ENDMETHOD. METHOD get_flight_list. DATA flight_list TYPE REF TO cl_demo_flight_list. IF area_handle IS INITIAL. TRY. area_handle = cl_demo_flights=>attach_for_read( ). CATCH cx_shm_attach_error. TRY. me->create_flight_list( ). area_handle = cl_demo_flights=>attach_for_read( ). CATCH cx_shm_attach_error. CREATE OBJECT flight_list. flight_list->set_flight_list( ). ENDTRY. ENDTRY. ENDIF. IF area_handle IS NOT INITIAL. flights = REF #( area_handle->root->flight_list ). ELSEIF flight_list IS NOT INITIAL. flights = REF #( flight_list->flight_list ). ELSE. RAISE EXCEPTION TYPE cx_no_flights. ENDIF. ENDMETHOD. METHOD create_flight_list. DATA: flight_list TYPE REF TO cl_demo_flight_list, exc_ref TYPE REF TO cx_no_flights. DATA(area_handle) = cl_demo_flights=>attach_for_write( ). CREATE OBJECT flight_list AREA HANDLE area_handle. area_handle->set_root( flight_list ). TRY. flight_list->set_flight_list( ). CATCH cx_no_flights INTO exc_ref. area_handle->detach_rollback( ). RAISE EXCEPTION exc_ref. ENDTRY. area_handle->detach_commit( ). ENDMETHOD. ENDCLASS. CLASS shm_demo DEFINITION. PUBLIC SECTION. CLASS-METHODS main. ENDCLASS. CLASS shm_demo IMPLEMENTATION. METHOD main. DATA: flight_list_handler TYPE REF TO demo_flight_list_handler, flight_list TYPE REF TO spfli_tab. flight_list_handler = demo_flight_list_handler=>flight_list_handler. TRY. flight_list = flight_list_handler->get_flight_list( ). CATCH cx_no_flights. cl_demo_output=>display_text( 'No flight list available' ). RETURN. ENDTRY. cl_demo_output=>display_data( flight_list->* ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. shm_demo=>main( ).
Area Root Class
The global class CL_DEMO_FLIGHT_LIST is used as an area root class. It contains the internal table FLIGHT_LIST (of type SPFLI_TAB from ABAP Dictionary) as a public attribute, which is filled by the method SET_FLIGHT_LIST. This table represents the unchangeable data that is accessed from different programs.
CL_DEMO_FLIGHTS is used as an area, whose properties are edited in transaction SHMA. The default values were applied apart from two exceptions:
- Versioning is deactivated because the data in the area instance should not be changed during the program runtime.
- The lifetime after the last access is restricted to five minutes. This prevents memory space from being occupied in the shared memory without a program requiring the memory.
Brokers and Loaders
demo_flight_list_handler encapsulates the access to the area before
the client (in the real world, this would be a global class). The static constructor creates one instance
of this class (singleton). The method
get_flight_list is used as a broker. It attempts to set a shared lock for an area instance. Within an
only one shared lock is possible for an area instance. Therefore the system first queries whether an
area handle area already exists. The alternative would have been to handle the exception CX_SHM_READ_LOCK_ACTIVE.
However, this would have been less effective in this example. If the operation is not successful, the
create_flight_list is called, which acts as a loader. This attempts
to set a exclusive lock and to build an area instance with a root object. Any exceptions that occur
are propagated to the calling method. A DETACH_ ROLLBACK is executed before any possible CX_NO_FLIGHTS
exceptions from SET_FLIGHT_LIST are forwarded to the calling program. If the change lock is not removed explicitly, the program is terminated at the end of the current internal session or possibly even beforehand.
If the area was built,
get_flight_list attempts to set a shared lock again.
If the area instance could not be built,
get_flight_list creates an object
of class ZCL_FLIGHT_LIST (as an emergency measure) in the current internal session and fills the internal
flight_list. Finally, a data reference to the flight list is assigned to the return value of the method (either in the root object of the shared object or in the local object).
The exclusive lock in
create_flight_list is closed explicitly, whereas a
shared lock in
get_flight_list is persisted until the end of the internal
session. The latter point (shared lock) is only possible for areas without versioning, if no more data-changing accesses are expected once an area has been built.
shm_demo demonstrates a client. The method
creates an object of the class
demo_flight_list_handler and attempts to read
a reference to the flight list. If the access is successful, the flight list is displayed in the
display method. It is not important for the client whether the data is actually contained in
the shared memory or (if an error occurs) in a local object of class CL_DEMO_FLIGHT_LIST. If no data can be read from the database, a message is displayed.
After the program call, the area instance version can be examined using transaction SHMM.