Cum pot identifica în ce context Java Applet rulează fără a transmite un ID?

Fac parte dintr-o echipă care dezvoltă un applet Java Swing destul de mare. Majoritatea codului nostru sunt moștenite și există tone de referințe singleton. Le-am adunat pe toate într-un singur singleton "Application Application". Ceea ce avem nevoie acum este de a crea o modalitate de a separa contextul partajat (partajat în toate applet-urile care se afișează în prezent) și contextul ne-comun (specific fiecărui applet afișat în prezent).

Cu toate acestea, nu avem o identitate la fiecare locație care sună la singleton și nici nu vrem să propagăm identitatea în toate locațiile. Care este cel mai simplu mod de a identifica în ce context applet se execută? (Am incercat sa ma intalnesc cu clasici, grupuri de thread, iduri de thread ... pana acum nu am gasit nimic care sa-mi permita sa-mi identifice originea apelului).

0
fr hi bn

3 răspunsuri

@Hugo privind filelocal:

M-am gândit la această soluție. Cu toate acestea, din experimente am găsit două probleme cu această abordare:

  1. Fișierele partajate (conexiunile la server, etc) sunt problematice. Acest lucru poate fi rezolvat prin acordarea unei atenții deosebite acestor subiecte (toate sunt sub controlul meu și sunt destul de izolate de codul vechi).
  2. Firele EDT sunt distribuite în toate aplicațiile. Nu am reușit să găsesc o cale de a forța crearea unui nou fir EDT pentru fiecare aplicație. Aceasta înseamnă că filelocal pentru EDT ar fi partajat în toate applet-urile. Aceasta nu am nici o idee cum să rezolv. Sugestii?
0
adăugat
Ar trebui să puteți obține un nou fir EDT utilizând o valoare diferită pentru eticheta de arhivă. Cred că puteți adăuga un nume de borcan la întâmplare chiar dacă acesta există.
adăugat autor Tom Hawtin - tackline, sursa

Dacă vă înțeleg corect, ideea este să obțineți un obiect "singleton" diferit pentru fiecare obiect apelant sau "context". Un lucru pe care îl puteți face este să creați o variabilă globală a thread-local unde scrieți ID-ul contextului curent. (Acest lucru se poate face cu AOP.) Apoi, în gettonul singleton, ID-ul de context este extras din thread-local pentru a fi folosit ca o cheie a instanței corecte "singleton" pentru contextul de apel.

În ceea ce privește AOP, nu ar trebui să fie nici o problemă să o folosești în aplicații, deoarece, în funcție de tăieturile tale, sfaturile sunt țesute la timpul de compilare și se adaugă un JAR la dependențele runtime. Prin urmare, nici o dovadă specială a AOP nu ar trebui să rămână la momentul executării.

0
adăugat

Singletonii sunt răi, ce vă așteptați? ;)

Poate că cea mai cuprinzătoare abordare ar fi să încărcați cea mai mare parte a applet-ului într-un alt încărcător de clasă (utilizați java.net.URLClassLoader.newInstance). Apoi folosiți un WeakHashMap pentru a asocia încărcătorul de clasă cu un applet. Dacă ați putea împărți majoritatea codului într-un încărcător de clasă obișnuit (ca părinte al fiecărui încărcător de clasă pe un applet) și în codul de bază al applet-ului, aceasta ar fi mai rapidă, dar mai multă muncă.

Alte hacuri:

Dacă aveți acces la orice componentă, puteți utiliza Component.getParent în mod repetat sau SwingUtilities.getRoot.

Dacă vă aflați într-un thread de instanță pe un applet, puteți configura un ThreadLocal.

Din EDT, puteți citi evenimentul curent din coadă (java.awt.EventQueue.getCurrentEvent ()) și, eventual, puteți găsi o componentă din acesta. Alternativ, împingeți un EventQueue cu o metodă dispatchEvent suprascrisă.

0
adăugat
Aceasta este (de departe) cea mai bună colecție de idei pe care am văzut-o pe această temă. Îmi place în special "împingeți un eveniment personalizat" - și o voi încerca.
adăugat autor Ran Biron, sursa