Utilizzo del registro RMI singolo
-
03-07-2019 - |
Domanda
Sto usando RMI per un progetto su cui sto attualmente lavorando e voglio associare più host a un unico registro RMI.
Tuttavia, quando provo a farlo, viene visualizzato un messaggio di errore
java.rmi.AccessException: Registry.Registry.bind non consentito; origin / 192.168.0.9 è host non locale
L'ho fatto su Google e sembra che RMI impedisca agli host remoti di legarsi per impostazione predefinita, cosa voglio sapere c'è un modo per sovrascrivere o bypassare questo?
Se qualcuno avesse qualche suggerimento su come superare questo problema, sarebbe molto apprezzato, ho provato a usare diversi file di criteri e sovrascrivere il gestore della sicurezza, ma nessuno sembra funzionare.
Soluzione 5
Grazie per la risposta di tutti, la soluzione che mi è venuta alla fine era quella di utilizzare Cajo Framework questo offre un sistema di distribuzione molto flessibile e mi ha permesso di gestire il registro come meglio credevo. Può anche funzionare dietro NAT, firewall e proxy HTTP, il che è molto utile.
Credo che il metodo di proxy suggerito da rndm.buoy funzionerà in alcuni casi, ma potrebbe essere problematico su alcuni sistemi. RMI sembra avere dei problemi con l'associazione all'interfaccia di rete sbagliata Ho riscontrato questo problema in particolare quando eseguivo distribuzioni Linux basate su Debian.
Altri suggerimenti
C'è un modo per aggirare il limite ma è quello che è: una soluzione. Comunque, sentiti libero di provarlo. Funziona per noi.
Sull'host che esegue il registro RMI centrale eseguire un piccolo servizio che associ un oggetto remoto con un solo metodo remoto: proxyRebind. L'implementazione di questo metodo lega semplicemente l'oggetto che gli viene fornito nel registro centrale (ciò non fallirebbe perché il registro si trova sullo stesso computer di questo servizio).
Tutti gli altri host cercano semplicemente questo oggetto remoto e invocano proxyRebind con i propri oggetti remoti.
Funziona perché è consentita la ricerca su registri ospitati in remoto. Il tuo tentativo originale non è riuscito perché non è consentito il bind su registri ospitati in remoto
Fammi sapere se hai bisogno di ulteriori chiarimenti al riguardo.
/ RS
2 C'è un modo per aggirare il limite ma è quello che è: a work-around. Comunque, sentiti libero di provare fuori. Funziona per noi.
Sull'host che esegue il registro centrale RMI esegue un piccolo servizio che vincolerà un telecomando oggetto con un solo metodo remoto: proxyRebind. L'implementazione di questo metodo lega semplicemente l'oggetto che gli viene fornito al centro registro (questo non fallirebbe perché il registro si trova sullo stesso computer di questo servizio).
Tutti gli altri host avrebbero semplicemente cercato questo oggetto remoto e invoca proxyRebind con il proprio telecomando oggetti.
Funziona perché cerca da remoto i registri ospitati sono consentiti. Il tuo tentativo originale fallito perché vincolante per i registri ospitati in remoto non è consentito.
Fammi sapere se hai bisogno di ulteriori chiarezza su questo.
Funziona perfettamente. L'unica cosa da fare è seguire sempre deve essere impostato correttamente. -Djava.rmi.server.hostname = " LOCAL HOST IP "
Potrei fraintendere la tua domanda, in tal caso, per favore fatemelo sapere.
Ho un'esperienza limitata con Java RMI, l'abbiamo usato nella nostra classe Design Patterns con Proxy Pattern. (Libro di testo: Headfirst Design Patterns)
Non siamo riusciti a far funzionare i nostri progetti al di fuori della rete universitaria, ma hanno funzionato perfettamente quando sono stati collegati direttamente alla rete. Secondo il nostro professore, non è stato possibile utilizzare RMI nella nostra implementazione su Internet o debole. Una soluzione che suggerì fu che sarebbe stata necessaria una VPN. Credo che Vladimir abbia ragione nel fatto che ha a che fare con il fatto che è un servizio di denominazione locale.
Potrei sbagliarmi, ma sembra che l'applicazione rmiregistry sia essenzialmente un wrapper sul servizio di denominazione locale. Ciò significa che non c'è modo di farlo puntare a oggetti remoti.
Ciò di cui hai bisogno è un'implementazione di denominazione e raggruppata in questo. Considerare di passare alla soluzione di clustering J2EE AS. L'albero JNDI è condiviso all'interno del cluster.