Singleton

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

Singleton

Beitrag von Meex (Specialist / 122 / 0 / 0 ) »
Hallo zusammen,

gibt es im ABAP Klassenkonzept irgendwie eine Möglichkeit der Realisierung einer Singleton Klasse, die Klasse sollte systemweit nur einmal instanzierbar sein, möglichst ohne irgendwelche Eintragungen in Z-Tabellen, nur rein im Memory?!

Danke

Meex

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi Meex.

Du kannst die Instanzierung auf "Privat" setzen (Eigenschaften -> Inst.-Erzeugung -> "Private") und Dir eine Factory bauen, die die Instanzerzeugung übernimmt bzw. eine bereits erzeugte Instanz zurückliefert.

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Beitrag von Meex (Specialist / 122 / 0 / 0 ) »
Hi Haubi,

aber ich kann doch nur auf die Instanzen meiner aktuellen Session zugreifen oder, wenn ein anderer User eine Instanz erzeugt hat, bekomme ich diese ja nicht direkt zu greifen, oder?

Meex

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi Meex.

Korrekt, die von mir beschriebene Vorgehensweise realisiert quasi ein "lokales Singleton". Für ein systemweites Singleton müßtest Du Dir etwas anderes einfallen lassen.

Wie wäre es mit einem Sperrobjekt, das nur für diesen Zweck verwendet wird? Die Sperre wäre z.B. auch gelöst, wenn eine Session "unkontrolliert" abbricht. Bei Tabelleneinträgen kann es da ja zu Problemen kommen...

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Singleton

Beitrag von Gast ( / / 0 / 3 ) »
Die Instanz im Klassenkonstruktor der Klasse erzeugen und per Exportingparameter diese Instanz exportieren.
Instanzkonstruktor wird nur beim Alleresten Aufruf der Klasse durchlaufen daher bekommt man nur eine Instanz.

mfg abapstrizi

Re: Singleton

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Anonymous hat geschrieben:Die Instanz im Klassenkonstruktor der Klasse erzeugen und per Exportingparameter diese Instanz exportieren.
Instanzkonstruktor wird nur beim Alleresten Aufruf der Klasse durchlaufen daher bekommt man nur eine Instanz.

mfg abapstrizi
Tach.

Also...
1. ...hat der Class Constructor keine Parameter (weil er implizit gerufen wird und es daher niemanden gibt, der sich fuer seine Parameter interessieren wuerde)
und
2. waere auch dies ein "lokaler Singleton", der sich auf eine Session/einen Modus bezieht. Gefragt ist ein "systemweiter Singleton"

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: Singleton

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Haubi hat geschrieben: Gefragt ist ein "systemweiter Singleton"
Hi Haubi,

ab 6.40 gibt es die Shared Objects. Diese erlauben das von dir gewünschte.

Hier beschreibt SAP dies sehr kurz.

Als Suchansatz in der ABAP-Hilfe:

- CLASS - class_options: SHARED MEMORY ENABLED
- CREATE OBJECT - AREA HANDLE


Gruß Hendrik

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
Hi JHM.

"Kurz" ist wohl die richtige Umschreibung...

Naja, eigentlich habe ja auch nicht ich gefragt sondern Meex, und der hat kein SY-SAPRL angegeben.
Haben die Ösis eigentlich schon 6.40... :shock: :lol:

Nichts für ungut. ;)

Gruss,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: Singleton

Beitrag von Hastalavista (ForumUser / 7 / 0 / 0 ) »
Hallo zusammen,

konnte hier jemand beim Shared Object Memomry mehr Erfahrung sammeln?
Ich versuche nach fast dem gleichen Schema, wie aus dem Tutorial http://www.korkisch.eu/IT/434 zu bauen. Allerdings habe ich ein Attribute in meiner Wurzelklasse, die auf ein automatisch generierte Proxyklasse referenziert und eine Methode, die dieses Objekt erzeugt.

Aber irgendwie funktioniert es nicht, ich bekomme die Fehlermeldung:

Die Lesesperre auf die Instanz '$DEFAULT_INSTANCE$' im Mandanten ' ' des Gebiets 'ZCL_PROXY_AREA' kann nicht gesetzt werden, da keine aktive Version vorliegt.
Es wurde aber der Gebietskonstruktor zum automatischen Aufbau der Gebietsinstanz gestartet.

Wie aktiviere ich so eine Version und was für eine Instanz muss ich mitgeben? Habt das noch nicht wirklich gerafft! :roll:

Programm:

Code: Alles auswählen.

DATA: LO_PROXY_AREA TYPE REF TO ZCL_PROXY_AREA.
DATA: LX_ERROR TYPE REF TO CX_ROOT.

  TRY.

      LO_PROXY_AREA = ZCL_PROXY_AREA=>ATTACH_FOR_READ( ). 

      LO_PROXY_AREA->ROOT->SET_INSTANCE( ).

      LO_PROXY_AREA->DETACH( ).

    CATCH CX_SHM_ATTACH_ERROR INTO LX_ERROR.

  ENDTRY.

Re: Singleton

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
Die Aufrufreihenfolge sollte ungefähr so sein:

Code: Alles auswählen.

DATA:
  lr_area   TYPE REF TO zcl_area,
  lr_root   TYPE REF TO zcl_root,   
  lr_except TYPE REF TO cx_shm_error.

  CLEAR lr_area.

  TRY.
      lr_area = zcl_area=>attach_for_read( ).
    CATCH cx_shm_inconsistent INTO lr_except.
      TRY.
          zcl_area=>invalidate_area( ).
        CATCH cx_shm_error INTO lr_except.
      ENDTRY.
    CATCH cx_shm_error INTO lr_except.
  ENDTRY.

  IF lr_area IS BOUND AND lr_area->root IS BOUND
    AND lr_area->is_valid( ) EQ abap_true.

* Verarbeitung mit dem Objekt durchführen

    TRY.
        lr_area->detach( ).
      CATCH cx_shm_error INTO lr_except.
    ENDTRY.

    CLEAR lr_area.
  ELSE.    
    IF ( lr_area IS BOUND AND lr_area->root IS BOUND ).
      TRY.
          lr_area->detach( ).
        CATCH cx_shm_error INTO lr_except.
      ENDTRY.
    ENDIF.
    
    CLEAR lr_area.

    TRY.
        lr_area = zcl_area=>attach_for_write( ).
      CATCH cx_shm_error INTO lr_except.
        RAISE EXCEPTION TYPE cx_shm_build_failed
          EXPORTING
            previous = lr_except.
    ENDTRY.
    
    CREATE OBJECT lr_root AREA HANDLE lr_area.
    lr_area->set_root( lr_root ).

* Objekt mit Daten befüllen

* Verarbeitung mit dem Objekt durchführen.

    TRY.
        lr_area->detach_commit( ).
      CATCH cx_shm_error INTO lr_except.
        RAISE EXCEPTION TYPE cx_shm_build_failed
          EXPORTING
            previous = lr_except.
    ENDTRY.

    CALL FUNCTION 'DB_COMMIT'.

  ENDIF.
Die Verarbeitung, vorallem beim Erzeugen eines neuen Areas, sollte so kurz wie möglich sein.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Singleton

Beitrag von a-dead-trousers (Top Expert / 4396 / 223 / 1182 ) »
Mit den "Instanzen" oder "Instanznamen" kannst du mehrere Datenobjekte auf einem Server verwalten.
Ich verwende das bei einer meiner Implementierungen z.B. für die Abbildung der Mandanten. Also je Mandant eine Instanz.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Singleton

Beitrag von Hastalavista (ForumUser / 7 / 0 / 0 ) »
a-dead-trousers, danke für die Unterstützung. Leider funktioniert es nicht so, wie ich es haben möchte.


Ich denke, ich muss mein Problem konkretisieren:

Wir haben Webservice im Einsatz und senden geänderte Planaufträge, die über MRP-Lauf gelaufen sind. Bei jeder Anlage, Änderung oder Löschung wird ein Event (TA: SWETYPV) gelöst, der wiederum ein Proxy-Objekt für die Verbindung erzeugt. Dies führt jetzt leider zur Speichermangel, weil bei jedem Event-Aufruf eine neue Proxy-Objekt erzeugt wird.

Die generierte Proxy-Klasse kann ich leider nicht auf "Shared Memory fähig" setzen (erbt von CL_PROXY_CLIENT).

Ich versuche es gerade mit dem Persistenzdienst - Meine Frage: Kann ich auch Objektrefenz persistent speichern ohne "Persistenteabbildung" zu machen. Wenn ja, welche Schritte muss ich noch beachten?

Code: Alles auswählen.

REPORT z_persistent.

DATA: agent      TYPE REF TO zca_persistent,
      connection TYPE REF TO zcl_persistent,
      lr_ref     TYPE REF TO ZCL_NO_PERSISTENT_CLASS. "Soll später eine Proxy-Klasse referenzieren
DATA  lv_object TYPE REF TO object.
*
DATA: exc TYPE REF TO cx_root.
DATA: lv_text TYPE char40.
*
agent = zca_persistent=>agent.

TRY .
    CALL METHOD agent->create_transient
      RECEIVING
        result = connection.
    TRY .

        DO 5 TIMES.
          IF NOT lr_ref IS BOUND.
            connection->set_gr_ref( lr_ref ).

            CALL METHOD connection->get_gr_ref
              RECEIVING
                result = lr_ref.

            CALL METHOD lr_ref->instantieted
              RECEIVING
                ev_result = lv_text.
*            LOG-POINT ID z_persistent FIELDS lv_text.
          ENDIF.
        ENDDO.
      CATCH cx_os_object_not_found INTO exc.
    ENDTRY.

  CATCH cx_os_object_existing INTO exc.
ENDTRY.

Seite 1 von 1

Vergleichbare Themen

11
Antw.
6231
Views
Singleton vs. statische Klasse
von ralf.wenzel » 17.12.2013 09:26 • Verfasst in ABAP Objects®
4
Antw.
2546
Views
Singleton einmal anders
von ralf.wenzel » 31.12.2018 10:23 • Verfasst in ABAP Objects®
1
Antw.
1367
Views
Eigener Modus für RFC-Call (Singleton)
von just » 10.05.2006 10:29 • Verfasst in Basis

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 11 Stunden von black_adept gelöst 23 / 3653
User Exit EXIT_RQCPRM10_001
vor 12 Stunden von a-dead-trousers 2 / 250
Trennen Strasse und Hausnummer
vor 18 Stunden von payten 13 / 10579
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1299

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 11 Stunden von black_adept gelöst 23 / 3653
User Exit EXIT_RQCPRM10_001
vor 12 Stunden von a-dead-trousers 2 / 250
Trennen Strasse und Hausnummer
vor 18 Stunden von payten 13 / 10579
Daten an Tabelle binden
Gestern von Lukas Sanders 2 / 1299

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2842
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9432