OSGi AspectService 获取方面服务的服务属性
OSGi AspectService get Service Properties of the Aspected Service
给定具有属性的服务 Sender
和方面服务 LogSender
,LogSender
如何获取当前 Sender
的服务属性?我想添加一个 属性 以选择性地记录特定 Sender
正在发送的数据。
component.getServiceProperties();
似乎 return LogSender
的服务属性而不是 Sender
的属性。
我查看了 ConfigAdmin
,但我没有看到将 LogSender
方面的 Sender
与所使用的特定配置相关联的方法。
如果相关的话,我正在使用 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)));
}
将原始Sender的服务属性注入LogSender切面,可以使用DependencyActivatorBase(或DependencyManager)中的签名,允许指定"add/change/remove"个LogSender切面回调方法:
DependencyActivatorBase.createAspectService(
Class<?> serviceInterface,
String serviceFilter,
int ranking,
String add,
String change,
String remove);
然后 LogSenderAspect 回调方法签名可以将 Sender 服务以及 Sender 服务属性 Map 作为参数。
现在,第二个(更简单的)解决方案是为您的方面指定服务过滤器,在本例中;无需指定任何回调。
我们来看第一种回调方案,LogSender切面定义了一个"setSender(Sender, Map)"方法,切面只会记录[=28]的Sender服务的"send"方法=] 服务属性(这里,我们忽略服务 change/removed 回调):
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();
}
}
这有帮助吗?
/皮埃尔
给定具有属性的服务 Sender
和方面服务 LogSender
,LogSender
如何获取当前 Sender
的服务属性?我想添加一个 属性 以选择性地记录特定 Sender
正在发送的数据。
component.getServiceProperties();
似乎 return LogSender
的服务属性而不是 Sender
的属性。
我查看了 ConfigAdmin
,但我没有看到将 LogSender
方面的 Sender
与所使用的特定配置相关联的方法。
如果相关的话,我正在使用 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)));
}
将原始Sender的服务属性注入LogSender切面,可以使用DependencyActivatorBase(或DependencyManager)中的签名,允许指定"add/change/remove"个LogSender切面回调方法:
DependencyActivatorBase.createAspectService(
Class<?> serviceInterface,
String serviceFilter,
int ranking,
String add,
String change,
String remove);
然后 LogSenderAspect 回调方法签名可以将 Sender 服务以及 Sender 服务属性 Map 作为参数。
现在,第二个(更简单的)解决方案是为您的方面指定服务过滤器,在本例中;无需指定任何回调。
我们来看第一种回调方案,LogSender切面定义了一个"setSender(Sender, Map)"方法,切面只会记录[=28]的Sender服务的"send"方法=] 服务属性(这里,我们忽略服务 change/removed 回调):
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();
}
}
这有帮助吗? /皮埃尔