2009-05-04 34 views
8

He estado utilizando RMI para un proyecto en el que estoy trabajando actualmente y quiero enlazar desde varios hosts a un solo registro de RMI.Uso de un solo registro de RMI

Sin embargo cuando intento hacerlo me sale un error que dice

java.rmi.AccessException: Registry.Registry.bind anulado; origen/192.168.0.9 es un servidor no local

Lo hice tan googleando y parece que RMI detiene hosts remotos de enlace por defecto, lo que quiero saber es ¿hay alguna manera de anular o pasar por alto esto?

Si alguien tiene alguna sugerencia sobre cómo superar este problema, sería muy apreciado, he intentado utilizar diferentes archivos de política y anular el administrador de seguridad, pero ninguno parece funcionar.

Respuesta

0

Gracias por everyones responde a la solución que se me ocurrió en el final era utilizar el Cajo Framework esto le da un sistema muy flexible para la distribución y que permiten para que maneje el registro como vi ajuste. También puede funcionar detrás de NAT, firewalls y proxies HTTP, lo cual es muy útil.

Creo que el método de proxy sugerido por rndm.buoy funcionará en algunos casos, pero puede ser problemático en algún sistema.Parece que RMI tiene algunos problemas para asociarse a una interfaz de red incorrecta. En particular, tuve este problema cuando ejecuté distribuciones Linux basadas en Debian.

0

Puedo estar equivocado, pero parece que la aplicación rmiregistry es esencialmente un envoltorio sobre el servicio local de nombres. Lo que significa que no hay forma de hacer que apunte a objetos remotos.

Lo que necesita es una implementación de nombres, y agrupada en esto. Considere pasar a la solución de agrupamiento J2EE AS. El árbol JNDI se comparte dentro del clúster.

+0

Usted está equivocado. El Registro RMI * es * un servicio de nombres. No es un envoltorio sobre nada. Simplemente no aceptará solicitudes de vinculación/reenvío/desvinculación que no sean del localhost. Eso no es lo mismo que no ser capaz de apuntar a objetos remotos. Puede. – EJP

1

Es posible que esté malinterpretando su pregunta, de ser así, hágamelo saber.

Tengo experiencia limitada con Java RMI, lo usamos en nuestra clase de Patrones de diseño con el Patrón de Proxy. (Libro de texto: patrones de diseño Headfirst)

No pudimos hacer que nuestros proyectos funcionaran fuera de la red de la universidad, pero funcionaron perfectamente cuando se conectaron directamente a la red. Según nuestro profesor, no fue posible utilizar RMI en nuestra implementación a través de Internet o wan. Una solución que sugirió era que se necesitaría una VPN. Creo que Vladimir tiene razón en que tiene que ver con que es un servicio local de nombres.

+0

No. Tiene que ver con que las devoluciones de llamada no son factibles en las redes con proxies del lado del cliente, y el problema descrito en el ítem A.1 de las preguntas frecuentes de RMI. El 'servicio local de nombres' es un producto de la imaginación. – EJP

7

Hay una forma de evitar la limitación pero es lo que es: una solución alternativa. De todos modos, siéntete libre de probarlo. Funciona para nosotros

En el host que ejecuta el registro RMI central, ejecute un servicio pequeño que enlazará un objeto remoto con solo un método remoto: proxyRebind. La implementación de este método simplemente vincula el objeto que se le proporciona en el registro central (esto no fallaría porque el registro está en la misma máquina que este servicio).

Todos los demás hosts simplemente buscarán este objeto remoto e invocar proxyRebind con sus propios objetos remotos.

Esto funciona porque se permite la búsqueda en registros alojados remotamente. Su intento original falló porque no se permite el enlace en registros alojados remotamente.

Deseo saber si necesita más aclaraciones al respecto.

/RS

+0

¡Eso es inteligente! Suena como algo que podría cerrarse como un potencial agujero de seguridad en una futura versión del JRE. No tomaría decisiones importantes sobre el diseño que dependan de esta técnica. –

+0

Si fuera cerrado, ¡habría sucedido hace mucho tiempo! ¡He estado haciendo esta implementación durante los últimos 10 años! – user40552

+0

rndm.buoy He intentado implementar esto y el objeto se enlaza con éxito, sin embargo, cuando intento invocar un método remoto obtengo la excepción 'java.rmi.ConnectException: Connection se negó a alojar: 127.0.1.1; La excepción anidada es: 'a pesar de que el objeto remoto debería resolverse en la IP 192.168.126.137 Me pregunto si hay algo que me falta si pudieras ampliar tu sugerencia, sería muy apreciado. –

2

2 Hay una manera de moverse por la limitación pero es lo que es: un solución alternativa. De todos modos, no dude en probar . Funciona para nosotros

En el host que ejecuta el registro central RMI dirige una pequeña servicio que se unirá un objeto remoto con sólo un método remoto: proxyRebind. La implementación de este método simplemente vincula el objeto que se le proporciona en el registro central (esto no fallaría porque el registro está en la misma máquina que este servicio).

Todos los otros anfitriones serían simplemente las operaciones de búsqueda este objeto remoto e invocar proxyRebind con sus propios objetos remotos .

Esto funciona porque se permite la búsqueda remota en registros alojados . Su intento original falló porque el enlace en los registros alojados remotamente no está permitido.

Avíseme si necesita alguna aclaración adicional sobre sobre esto.

Esto funciona perfectamente. Lo único que debe tener cuidado es seguir siempre se debe configurar correctamente. -Djava.rmi.server.hostname = "IP HOST LOCAL"

+0

Solo es necesario establecer 'java.rmi.server.hostname' en un host de múltiples hosts o si hay algo mal con su DNS como se describe en el elemento [A.1 de las preguntas frecuentes de RMI] (http://docs.oracle .com/javase/7/docs/technotes/guides/rmi/faq.html # dominio). – EJP

Cuestiones relacionadas