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 / 1188 / 1 / 195 ) »
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 / 4271 / 213 / 1140 ) »
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 / 4271 / 213 / 1140 ) »
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.
5809
Views
Singleton vs. statische Klasse
von ralf.wenzel » 17.12.2013 09:26 • Verfasst in ABAP Objects®
4
Antw.
2246
Views
Singleton einmal anders
von ralf.wenzel » 31.12.2018 10:23 • Verfasst in ABAP Objects®
1
Antw.
1243
Views
Eigener Modus für RFC-Call (Singleton)
von just » 10.05.2006 10:29 • Verfasst in Basis

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.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141