2009-05-04 13 views
8

Utilizzo RMI per un progetto su cui sto lavorando attualmente e desidero eseguire il bind da più host a un singolo registro RMI.Utilizzo del registro RMI singolo

Tuttavia quando tento di farlo ottengo un errore che dice

java.rmi.AccessException: Registry.Registry.bind annullato; origine/192.168.0.9 è l'host non locale

Ho fatto così google e sembra che RMI interrompe gli host remoti dal binding di default, quello che voglio sapere è un modo per ignorarlo o bypassarlo?

Se qualcuno avesse qualche suggerimento su come superare questo problema, sarebbe molto apprezzato, ho provato a utilizzare diversi file di criteri e a sovrascrivere il gestore di sicurezza, ma nessuno sembra funzionare.

risposta

0

Grazie per tutti quanti risponde la soluzione mi è venuta alla fine è stato quello di utilizzare la Cajo Framework questo dà un sistema molto flessibile per la distribuzione e ha permesso per me da gestire il Registro di sistema come ho visto in forma. 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 in alcuni sistemi.RMI sembra avere alcuni problemi con l'associazione all'interfaccia di rete sbagliata. Ho avuto questo problema in particolare durante l'esecuzione su distribuzioni Linux basate su Debian.

0

Potrei sbagliarmi, ma sembra che l'applicazione rmiregistry sia essenzialmente un wrapper sul servizio di denominazione locale. Il che significa che non c'è modo di farlo puntare agli oggetti remoti.

Ciò di cui avete bisogno è un'implementazione di denominazione e raggruppata in questo. Considera di passare alla soluzione di clustering J2EE AS. L'albero JNDI è condiviso all'interno del cluster.

+0

Si sbaglia. Il registro RMI * è * un servizio di denominazione. Non è un involucro per nulla. Semplicemente non accetterà richieste di binding/rebind/unbind diverse dal localhost. Non è la stessa cosa che non essere in grado di puntare a oggetti remoti. Può. – EJP

1

Potrei essere fraintendere la tua domanda, in tal caso, per favore fatemelo sapere.

Ho un'esperienza limitata con Java RMI, lo abbiamo utilizzato nella nostra classe Pattern Design con il modello Proxy. (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 collegati direttamente alla rete. Secondo il nostro professore, non è stato possibile utilizzare RMI nella nostra implementazione su internet o wan. Una soluzione suggeriva era che sarebbe stata necessaria una VPN. Credo che Vladimir abbia ragione nel senso che si tratta di un servizio di denominazione locale.

+0

No. Riguarda che i callback non sono fattibili su reti con proxy lato client e il problema descritto nell'articolo A.1 delle domande frequenti sull'RMI. 'Servizio locale di denominazione' è un frutto dell'immaginazione. – EJP

7

C'è un modo per aggirare la limitazione ma è quello che è: un work-around. Ad ogni modo, sentiti libero di provarlo. Funziona per noi.

Sull'host su cui è in esecuzione il registro RMI centrale viene eseguito un piccolo servizio che associa un oggetto remoto a un solo metodo remoto: proxyRebind. L'implementazione di questo metodo lega semplicemente l'oggetto che gli viene fornito nel registro centrale (questo non fallirebbe perché il registro si trova sulla stessa macchina di questo servizio).

Tutti gli altri host devono semplicemente cercare questo oggetto remoto e richiamare proxyRebind con i propri oggetti remoti.

Questo funziona perché è consentita la ricerca su registri in hosting in remoto. Il tuo tentativo originale non è riuscito perché l'associazione su registri ospitati in remoto non è consentita.

Fatemi sapere se avete bisogno di ulteriore chiarezza su questo.

/RS

+0

È intelligente! Sembra una cosa che potrebbe essere chiusa come potenziale buco di sicurezza in una futura versione di JRE. Non prenderei decisioni importanti sul design a seconda di questa tecnica. –

+0

Se dovesse essere chiuso, sarebbe successo molto tempo fa! Ho fatto questa implementazione negli ultimi 10 anni! – user40552

+0

rndm.buoy Ho tentato di implementare questo e l'oggetto si collega effettivamente con successo tuttavia quando tento di richiamare un metodo remoto ottengo l'eccezione 'java.rmi.ConnectException: Connessione rifiutata all'host: 127.0.1.1; l'eccezione annidata è: 'anche se l'oggetto remoto dovrebbe risolvere l'IP 192.168.126.137 Mi chiedo se ci sia qualcosa che mi manca potresti per favore espandere il tuo suggerimento sarebbe molto apprezzato. –

2

2 C'è un modo per aggirare la limitazione ma è quello che è: un work-around. In ogni caso, sentiti libero di provare fuori. Funziona per noi.

Sul host che esegue il centrale registro RMI eseguire un piccolo servizio che legano un oggetto remoto con un solo metodo remoto: proxyRebind. L'implementazione di questo metodo lega semplicemente l'oggetto fornito nel registro centrale (ciò non fallire perché il registro si trova sulla stessa macchina di questo servizio).

Tutti gli altri host sarebbe semplicemente occhiata questo oggetto remoto e invocare proxyRebind con i propri remoti oggetti.

Questo funziona perché è consentita la ricerca su registri in hosting in modalità remota. Il tuo tentativo originale non è riuscito perché l'associazione ai registri ospitati in remoto non è consentita.

Fatemi sapere se avete bisogno di ulteriore chiarezza su questo.

Questo funziona perfettamente. L'unica cosa da fare è seguire dovrebbe essere sempre impostato correttamente. -Djava.rmi.server.hostname = "IP HOST LOCALE"

+0

È necessario solo impostare 'java.rmi.server.hostname' in un host multihomed o se c'è qualcosa di sbagliato nel DNS come descritto nell'elemento [A.1 delle domande frequenti sull'RMI] (http://docs.oracle .com/JavaSE/7/docs/note tecniche/guide/rmi/faq.html # dominio). – EJP