代码之家  ›  专栏  ›  技术社区  ›  Rob Paisley

OSGi AspectService获取Aspected服务的服务属性

  •  0
  • Rob Paisley  · 技术社区  · 7 年前

    提供服务 Sender 具有属性和方面服务 LogSender ,如何 日志发送器 获取当前 发件人 ? 我想添加一个属性来选择性地记录特定 发件人 正在发送。

    component.getServiceProperties(); 似乎返回了 日志发送器 的服务属性,而不是 发件人 的属性。

    我已经看过了 ConfigAdmin 但我看不出有什么办法把 发件人 那个 日志发送器 aspected,使用特定配置。

    如果相关的话,我将使用Apache Felix作为我的OSGi容器。

    这是 Activator init 添加后的方法 ConfigurationAdmin 到依赖项列表。

    public void init(BundleContext context, DependencyManager manager) throws Exception {
         manager.add(createAspectService(Sender.class, null, 10).setImplementation(LogSender.class)
                .add(createServiceDependency().setService(ConfigurationAdmin.class)
                        .setRequired(true)));
                .add(createServiceDependency().setService(LogService.class).setRequired(true)));
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Pierre De Rop    7 年前

    要将原始发件人的服务属性注入LogSender方面,可以使用DependencyActivatorBase(或DependencyManager)中的签名,该签名允许指定“添加/更改/删除”LogSender方面回调方法:

    DependencyActivatorBase.createAspectService(
        Class<?> serviceInterface,
        String serviceFilter,
        int ranking,
        String add,
        String change,
        String remove);
    

    然后,LogSenderSpect回调方法签名可以将发送方服务以及发送方服务属性映射作为参数。

    现在,第二个(更简单的)解决方案是为您的方面指定服务过滤器,在本例中;无需指定任何回调。

    让我们看一下第一个回调解决方案,其中LogSender方面定义了一个“setSender(Sender,Map)”方法,然后该方面将只记录具有“foo=bar”服务属性的发送方服务的“send”方法(在这里,我们忽略服务更改/删除的回调):

    public class Activator extends DependencyActivatorBase{
        public void init(BundleContext ctx, DependencyManager dm) throws Exception {
            Component logSender = createAspectService(Sender.class, null, 10, "setSender", null, null)
                    .setImplementation(LogSender.class)    
                    .add(createServiceDependency().setService(LogService.class).setRequired(true));
            dm.add(logSender);         
        }
    }
    
    class LogSender implements Sender {     
        volatile Sender sender;
        volatile Map<String, Object> senderProperties;
        volatile LogService log;
    
        void setSender(Sender sender, Map<String, Object> senderProperties) {
            this.sender = sender;
            this.senderProperties = senderProperties;
        }
    
        @Override
        public void send() {
            if ("bar".equals(senderProperties.get("foo"))) {
                log.log(LogService.LOG_DEBUG, "calling method send called on Sender service having properties foo=bar");
            }
            this.sender.send();         
        }       
    }
    

    现在,一个更简单的解决方案是在定义方面时使用服务过滤器“(foo=bar)”,在这种情况下,无需使用回调:

    public class Activator extends DependencyActivatorBase{
        public void init(BundleContext ctx, DependencyManager dm) throws Exception {
            Component logSender = createAspectService(Sender.class, "(foo=bar)", 10)
                    .setImplementation(LogSender.class)    
                    .add(createServiceDependency().setService(LogService.class).setRequired(true));
            dm.add(logSender);         
        }
    }
    
    class LogSender implements Sender {     
        volatile Sender sender;
    
        @Override
        public void send() {
            log.log(LogService.LOG_DEBUG, "calling method send called on Sender service having properties foo=bar");
            this.sender.send();
        }       
    }
    

    这有帮助吗? /皮埃尔