OSGi AspectService获取所需服务的服务属性

时间:2018-01-20 10:45:50

标签: java osgi felix-dependency-manager

如果服务Sender包含属性和方面服务LogSenderLogSender如何获取当前Sender的服务属性?我想添加一个属性来选择性地记录特定Sender正在发送的数据。

component.getServiceProperties();似乎返回了LogSender的服务属性,而不是Sender的属性。

我已查看ConfigAdmin,但我没有看到将Sender所考虑的LogSender与所使用的具体配置相关联的方法。

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

在将Activator添加到依赖关系列表后,init的{​​{1}}方法。

ConfigurationAdmin

1 个答案:

答案 0 :(得分:0)

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

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

然后LogSenderAspect回调方法签名可以作为Sender服务的参数,以及Sender服务属性Map。

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

让我们看看第一个带回调的解决方案,其中LogSender方面定义了一个“setSender(Sender,Map)”方法,然后该方面将仅记录具有“foo = bar”的Sender服务的“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();
    }       
}

这有帮助吗? /皮尔