SessionManager für Kernel-Plugin

  • Hey zusammen :)


    Ich versuche mich grade daran, mal testweise ein Plugin für den Kernel zu erstellen. Dabei möchte ich mich wie die GUI zum Kernel verbinden und habe dafür in einem anderen Thread ein Code-Snippet gefunden.


    Wenn ich dieses nun wie folgt anwende:


    erhalte ich immer den Fehler:

    Code
    2019-06-04 14:58:49,705 [Main] INFO  meinAddOn.meinAddOnPlugin - DESKTOP-KLEOGFT
    2019-06-04 14:58:49,732 [Main] INFO  meinAddOn.meinAddOnPlugin - No Project loaded!
    2019-06-04 14:58:49,739 [Main] WARN  org.dmxc.lumos.Kernel.Run.KernelRunManager - Some Services are still not started: PluginManager, FannedValueManager, SettingsManager, ThreadManager, ResourceManager, AttachableManager, ProjectManager, KernelNetManager, KernelTimecodeReceiver, SessionManager
    2019-06-04 14:58:49,741 [Main] ERROR meinAddOn.meinAddOnPlugin - SessionManager-Error: Manager has to be initialized first: SessionManager


    Bin da grade etwas ratlos - denn die Ausgabe von Hostname und aktuellem Projekt funktioniert ja. Das vollständige Log habe ich angehangen, da steht auch vor diesem Fehler, dass der SessionManager initialisiert wurde.


    Zum Hintergrund: Das Plugin soll Änderungen an Cuelists, Devices, Masters etc. erkennen, da sah der MessageListener, den man an den SessionManager binden kann recht vielversprechend aus - oder gibt es hier eine bessere Methode?


    Würde mich freuen, wenn ihr eine Idee für mich habt.


    Viele Grüße

    Marvin

  • Du das feld "ManagerDependecies" überschreiben und da den typpeof( SessionManager) zurückgeben.
    Hab grad den Code nicht offen, aber irgendwie so war das.


    Problem ist, das der SessionManager zu diesem zeitpunkt noch nicht gestartet ist.

    Wenn du das oben beschriebene machst, dann wird das Plugin erst später gestartet, wenn der SessionManager gestartet ist


    MfG

    Patrick

  • Hallo,


    Ich glaube ich sehe das Problem. Die Plugins werden zu früh gestartet. Ich fix das in der 3.2. Für die 3.1.3 musst du einen Workaround bauen, z.B. einen Thread der Wartet bis "SessionManager.IsInitialized" und "IsStarted" beide true sind.


    Gruß Arne

  • Hey,


    also mit dem Thread hats geklappt, es wird nun eine Session erzeugt und der Listener gebunden.

    Die "ManagerDependencies" habe ich für Plugins nicht gefunden (ich verwende die 3.1.3), lediglich für Manager selber... Wäre aber ggf. auch für Plugins spannend wenn ein Plugin auf ein anderes zugreifen soll.


    Unsicher bin ich mir nur noch, welche Werte ich beim Binden für die Parameter producerID und die messageID angeben soll - im Idealfall soll der Listener einfach alles mitbekommen und selber filtern. Ich habe hioer schon String.Empty, "*" und null probiert... Wenn ihr mir da nochmal kurz auf die Sprünge helfen könntet wäre das klasse :) Ist denn die Idee über diesen Listener geänderte Objekte "abzuhören" überhaupt der richtige Weg?


    Viele Grüße und vielen Dank für die Hilfe

    Marvin

  • Hey,


    das klingt logisch, aber wie muss ich das angeben? Habe jetzt folgendes:


    Code
    org.dmxc.lumos.Kernel.GUISession.IGUISession session;            
    session = sessionManager.registerSession("MeinAddOn", new string[] { System.Net.Dns.GetHostName() }, org.dmxc.lumos.Kernel.GUISession.EConnectionType.LOCAL);
    
    var iListener = new myMessageListener(iMessageCallback);
    session.registerMessageListener(iListener, (Guid.NewGuid().ToString()), (Guid.NewGuid().ToString()));
    Log.Info("iListener gebunden");

    Die Ausgabe iListener gebunden erscheint auch im Log, aber bei der registerMessageListener-Methode muss ich ja die beiden IDs angeben. Wenn die producerID im ganzen Plugin gleich sein soll, tuts ja eine GUID. Aber was gebe ich hier für die messageID an, wenn jede Message am Ende eine eigene ID haben soll?


    Der myMessageListener sieht so aus:

    Das onMessage wird aber nie ausgeführt, onMessage ausgelöst erscheint nicht im Log. Oder verstehe ich das ganze Konstrukt der Session-Messages falsch? So wie ich das sehe müsste darüber doch eine Session über Änderungen an zb. einem Device informiert werden, d.h. ich füge ein Device hinzu/ändere den Namen eines Devices und die Message müsste vom Listener aufgefangen werden?


    Vg

    Marvin

  • Man muss zwischen "registerMessageProducer" und "registerMessageListener" unterscheiden.


    Beim "listener" musst du quasi die Ziel IDs angeben, also quasi die Message die du empfangen willst.


    Die sind nicht wirklich dokumentiert..... Am besten du schreibst hier mal, für welche Messages du dich interessierst, dann suche ich dir die IDs raus.


    Gruß Arne

  • Hey,


    das wäre wirklich super :) Aktuell würde ich gerne folgende Messages empfangen:

    • org.dmxc.lumos.Kernel.Messaging.Message.DeviceGroupChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.DeviceChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.ScenelistGroupChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.ScenelistChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneListStartMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneListStopMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.ExecutorPageChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.ExecutorChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.MasterChangedMessage
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneEntryChangedMessage

    D.h. ich würde dann für jeden Typen einen Listener registrieren und die jeweilige MessageID dabei angeben. Was gebe ich denn als ProducerID an?

    Ansonsten bin ich mittlerweile von den Möglichkeiten, welche die Schnittstellen so bieten echt begeistert :)


    Viele Grüße

    Marvin

    • org.dmxc.lumos.Kernel.Messaging.Message.DeviceGroupChangedMessage
      • registerMessageListener(..., "DeviceManager", "DeviceGroupChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.DeviceChangedMessage
      • registerMessageListener(..., "DeviceManager", "DeviceChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.ScenelistGroupChangedMessage
      • registerMessageListener(..., "SceneListManager", "SceneListGroupChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.ScenelistChangedMessage
      • registerMessageListener(..., "SceneListManager", "SceneListChanged"); //Generelle Änderungen (Scenenliste angelegt oder gelöscht)
      • registerMessageListener(..., "SceneList/" + scenelist.ID, "ScenelistChanged"); //Lokale Änderungen innerhalb einer Scenenliste
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneListStartMessage
      • registerMessageListener(..., "SceneList/" + scenelist.ID, "ScenelistStart");
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneListStopMessage
      • registerMessageListener(..., "SceneList/" + scenelist.ID, "ScenelistStop");
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneChangedMessage
      • registerMessageListener(..., "SceneList/" + scenelist.ID, "SceneChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.ExecutorPageChangedMessage
      • registerMessageListener(..., "ExecutorManager", "OnExecutorPageChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.ExecutorChangedMessage
      • registerMessageListener(..., "ExecutorManager", "OnExecutorChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.MasterChangedMessage
      • registerMessageListener(..., "MasterManager", "MasterChanged");
    • org.dmxc.lumos.Kernel.Messaging.Message.SceneEntryChangedMessage
      • Wird aktuell nur im Programmierkontext verwendet
      • registerMessageListener(..., "Programmer/" + session.Name, "SceneChanged");
  • Newly created posts will remain inaccessible for others until approved by a moderator.

    The last reply was more than 365 days ago, this thread is most likely obsolete. It is recommended to create a new thread instead.