2017-09-04 79 views
0

这里之前动态引用的注入是intrested案例片段:阿帕奇菲利克斯 - 如何保证一个激活方法

我们有一些配置类可以有多个实例。它假设我们在一个包中提供多种配置。这是一个范围。

@Service 
@Component 
public class SampleConfigurationImpl implements SampleConfiguration { 
    // declaration of some properties, init method and etc... 
} 

另外,我们有一个使用这些配置的服务:

@Service 
@Component 
public class SampleServiceImpl implements SampleService { 

    @Reference(
     referenceInterface = SampleConfiguration.class, 
     cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, 
     policy = ReferencePolicy.DYNAMIC) 
    private Map<String, SampleConfiguration> sampleConfigurations = new ConcurrentHashMap<>(); 

    private void bindSampleConfigurations(SampleConfiguration sampleConfiguration) { 
     sampleConfigurations.put(sampleConfiguration.getName(), sampleConfiguration); 
    } 

    private void unbindSampleConfigurations(SampleConfiguration sampleConfiguration) { 
     sampleConfigurations.remove(sampleConfiguration.getName()); 
    } 

    @Activate 
    private void init() { 
     System.out.println(sampleConfigurations.size()); 
    } 

} 

所以,我可以得到一些保证,在init()方法的调用所有配置都注射(至少当前包的)?也许有一些替代方法来做到这一点。我知道另一个捆绑包可以带来新的配置,获得保证是不真实的,但只有一个捆绑包才有意义。

在实践中,它可能是在init方法中只有部分配置的情况。特别是如果你遇到几种类型的配置或者一种服务使用另一种具有动态引用和第一种服务的服务依赖于注入所有东西的事实,那么情况就更加困难。

最不愉快的是它可以在init方法之前和之后绑定/取消绑定配置。 也许有一种方法可以保证它始终绑定在init方法之后...

我对任何信息感兴趣。在两个问题上得到答案(在之前或之后提供保证)会很好。可能有人经历过如何解决此类问题,并可以与我分享。

谢谢。

回答

1

不,我不知道。在这种情况下,我通常会这样做(取决于您的用例,它取决于您的激活代码是否可以多次运行)是创建一个'reallyActivate'方法,我从常规激活和bindSampleConfigurations(+设置激活中的isActivated标志)。然后,我可以在每次新的SampleConfiguration被绑定时执行一些逻辑,即使是在激活之后。这对你的情况有帮助吗?

+1

弗兰克是正确的。动态引用可以在*激活之前,之后或*期间随时绑定(是,在激活方法执行时,可以从另一个线程同时绑定服务)。这只是动态引用的价格...您可能希望使用带有贪婪策略的静态引用。顺便说一下,您怀疑您正在使用服务来注入配置。为什么不使用用于DS的配置管理绑定,其中配置对象被传递到activate方法中? –

+0

谢谢弗兰克。它可以帮助我,但在这种情况下,我必须考虑到它必须以不同的方式在init方法之前和之后绑定配置(在init方法之前,我不确定是否注入了所有静态引用,并且需要在init之后推迟它方法)。另外,我必须创建一些未处理的配置队列,并在init方法处理它之后。它带来了额外的逻辑来同步这种服务的状态以反映新配置的绑定。我同意,这听起来很奇怪。 – Alex

+0

@NeilBartlett也感谢你。我是正确的,通过配置管理绑定DS您意味着为SampleServiceImpl添加configurationPid =“com.sample.SampleConfigurationImpl”属性?在这种情况下,它创建N个服务器,其中N是配置的数量。当我需要将此服务注入到另一个组件时,它不适合。为什么不?我希望有一些服务可以处理请求,并且可以决定它需要使用哪些配置以用于特定参数。听起来很合理。所以,即使我调用当前包的servlet,我也不确定所有配置都是绑定的。 – Alex