es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OSGi – Los bundles dependen entre sí.

Tengo dos paquetes:

  1. Servicio de internacionalización (I18n)
  2. Servicio de persistencia (Base de datos)

El caso es que el paquete “I18n” utiliza los servicios de la base de datos para almacenar “Textos” y “Mensajes” en diferentes idiomas. Y el Servicio de Persistencia también utiliza “I18n” para almacenar algunos “Mensajes de Error” en diferentes idiomas, por lo que cada servicio depende del otro, pero no deberían trabajar juntos, ya que ambos ofrecen diferentes tipos de servicios.

Mi pregunta es: ¿Alguien conoce un “Patrón” o “Estructura” que pueda ayudarme a resolver este problema? Necesito registrar estos servicios y permitirles utilizar el uno al otro.

En el Activador del Servicio de Persistencia, tengo la siguiente dependencia declarada:

dependencyManager.add(createComponent()
            .setImplementation(PersistenceImpl.class)
            .add(createServiceDependency()
                    .setService(I18nService.class)
                    .setRequired(true))
    );

Pero lo mismo no puede hacerse con “I18n”, en ese caso ninguno de ellos se iniciaría:

dependencyManager.add(createComponent()
            .setImplementation(I18nImpl.class)
            .add(createServiceDependency()
                    .setService(PersistenceService.class)
                    .setRequired(true))
    );

Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una posible solución a este problema es utilizar el patrón de pizarra blanca de OSGi. Así es como se puede implementar:

    1. Defina una interfaz que ambas servicios implementarán, por ejemplo:
    public interface MessageProvider {
        String getMessage(String key, String language);
    }
    
    1. Modifique el servicio I18n para registrarse como un MessageProvider utilizando el patrón de pizarra blanca de OSGi:
    public void start(BundleContext context) throws Exception {
        Hashtable<string, object=""> properties = new Hashtable<string, object="">();
        properties.put(Constants.SERVICE_RANKING, 100);
        context.registerService(MessageProvider.class.getName(), this, properties);
    }
    
    1. Modifique el servicio Persistence para buscar todos los servicios MessageProvider utilizando el patrón de pizarra blanca de OSGi:
    private final Map<string, messageprovider=""> messageProviders = new HashMap<>();
    
    public void start(BundleContext context) throws Exception {
        ServiceReference[] refs = context.getServiceReferences(
            MessageProvider.class.getName(), null);
        for (ServiceReference ref : refs) {
            MessageProvider provider = (MessageProvider) context.getService(ref);
            messageProviders.put(ref.getBundle().getSymbolicName(), provider);
        }
    }
    
    public void stop(BundleContext context) throws Exception {
        messageProviders.clear();
    }
    
    public String getErrorMessage(String key, String language) {
        MessageProvider provider = messageProviders.get("i18n-bundle");
        if (provider != null) {
            return provider.getMessage(key, language);
        }
        return null;
    }
    

    En este ejemplo, el servicio Persistence busca todos los servicios que implementan la interfaz MessageProvider y los almacena en un mapa. Luego utiliza el método getMessage del servicio MessageProvider para recuperar mensajes de error en diferentes idiomas.

    1. Actualice el activador del servicio Persistence para declarar una dependencia del servicio MessageProvider:
    dependencyManager.add(createComponent()
            .setImplementation(PersistenceImpl.class)
            .add(createServiceDependency()
                    .setService(MessageProvider.class)
                    .setRequired(true))
    );
    

    Esto asegurará que el servicio Persistence dependa de al menos un servicio MessageProvider, que será proporcionado por el servicio I18n.

    Con este enfoque, cada servicio permanece independiente y no depende directamente del otro servicio. Cada uno puede registrar y descubrir servicios utilizando el patrón de pizarra blanca de OSGi, lo que permite una mayor flexibilidad y desacoplamiento.</string,></string,></string,>

Comments are closed.