Hi David,
Is there an example of how to use the BND flags -dsannotations=* and
-dsannotations-inherited=true flags with the BND annotations? Is it a
specific version of BND or the Maven Bundle Plugin?
I created a simple abstract component which contained @Reference set/unset
methods for the Concrete @Component class. When I review the generated
component.xml files in the bundle though there isn't a generated reference
element.
My pom.xml maven-bundle-plugin config:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<inherited>true</inherited>
<configuration>
<instructions>
<Export-Package>
${project.artifactId}
</Export-Package>
<Import-Package>
!${project.artifactId},
*
</Import-Package>
<Private-Package>
${project.artifactId}.component,
${project.artifactId}.impl
</Private-Package>
<Service-Component>*</Service-Component>
<_dsannotations>*</_dsannotations>
<_dsannotations-inherited>true</_dsannotations-inherited>
<!--
<_dsannotations-inherit>true</_dsannotations-inherit> -->
<!-- <_dsannotations> -->
<!--
org.apache.karaf.scr.examples.component.factories.component.AbstractManager,
-->
<!--
org.apache.karaf.scr.examples.component.factories.component.GreeterServiceFactoryManager
-->
<!-- </_dsannotations> -->
</instructions>
</configuration>
</plugin>
On Mon, Sep 17, 2012 at 10:33 AM, David Jencks <[email protected]>wrote:
> inline....
> On Sep 17, 2012, at 5:47 AM, Scott England-Sullivan wrote:
>
> David,
>
> Thanks for all the notes! I really appreciate your taking the time to go
> over it all so thoroughly.
>
> I have questions, comments and clarifications inline.
>
> Thanks again,
> Scott
>
> On Mon, Sep 17, 2012 at 1:13 AM, David Jencks <[email protected]>wrote:
>
>> minor quibles...
>>
>> you can enable inheritance processing the osgi annotations with bnd with
>> the -
>>
>
> ??? regarding -
>
>
> gah, sorry, in bnd next anyway (I wouldn't trust the annotation support
> elsewhere)
>
> -dsannotations-inherit=true
>
> will give you inheritance support. You also need to specify which classes
> should be scanned with
>
> -dsannotations=* or list of classes
>
>
> When did BND start supporting inheritance of the annotated components?
> Also, I thought that it was still be discussed over at the OSGi Alliance.
>
>
> I think this is a bnd extension for the moment.
>
>
>
>>
>> I'm not sure what you mean by this:
>>
>> *If your service needs to be realized immediately you can do so by
>> adding the immediate attribute set to true on the @Component annotation.
>> F**or instance if you want to activate a component that does implement
>> an interface but isn't considered a service you will need to add this
>> attribute.*
>>
>> Components that are not registered as services have to be immediate, as
>> there is no other way their creation could ever get triggered. Only
>> components registered as services can be (meaningfully) marked as immediate.
>>
>
> I think I need to rewrite this. I am discussing a "delayed component" (a
> component that implements an interface) and that it can be forced to be an
> immediate component. Components that implement an interface, using the BND
> annotations, defaults to delayed.
>
>
> yes.
>
>
>
>>
>> This seems slightly misleading to me, but I might be nitpicking:
>> Back in Part
>> 1<http://sully6768.blogspot.com/2012/09/scr-components-with-karaf-part-1.html>you
>> may remember that the GreeterService was in an
>> *Active<http://sully6768.blogspot.com/2012/09/scr-components-with-karaf-part-1.html#active_components>
>> * state after it was installed. This was due to there being an active
>> consumer of the service in the container, the GreeterComponent*.* Since
>> the GreeterComponent was in an Active state, the containers SCR instance
>> created an instance of the GreeterService and injected into our
>> GreeterComponent.
>>
>> GreeterService is a mandatory dependency for GreeterComponent. Therefore
>> GreeterComponent cannot be active until its dependency is satisfied, that
>> is there is an active GreeterService. Since all your components are
>> enabled, GreeterService is activated, registering the ServiceRegistration.
>> Then GreeterComponent is satisfied, so it is activated and, being
>> immediate (not a service) the implementation object is created. Since the
>> dependency uses the service object rather than a service reference, the
>> GreeterService is instantiated so it can be injected into the
>> GreeterComponent.
>>
>> I hope this makes bnd generate an error for non-service components:
>> *Again, this can be overridden if you need to by adding the immediate
>> attribute
>> set to false on the @Component annotation.*
>>
>
> It doesn't but I see your point on this one. I will rewrite/remove within
> the context.
>
>
>> As noted above, if you could do this your component would never get
>> activated.
>>
>>
>> I don't understand what behavior you are discussing here:
>> So what happened? Before when we only had the activate & deactivate
>> method defined the activate & deactivate life-cycles were used to manage
>> all updates of the component. This allowed our components to de/activate
>> cleanly. When the component is configured with the modified life-cycle the
>> *SCR* will only call the modified method which never causes the *
>> ManagedGreeterService* to become *UNSATISFIED*. Therefore any component
>> with a *dependency* on the *ManagedGreeterService* is never notified
>> that there has been a change in the state of the component and they
>> continue upon their merry way oblivious to the changes.
>>
>>
> Basically what you said below but you said it better. :)
>
> I just wanted to call attention to the difference in behaviors especially
> for users that are new to DS. I will take a look at clarifying the text
> though.
>
>
>> If you delete the configuration, DS should deactivate your compnent using
>> the configuration (it's required). If its modified, if there's a modify
>> method that will be called, otherwise the component will be deactivated and
>> reactivated with the new configuration. If you want a component with a
>> reference to a service configured via config admin to be notified when the
>> configuration changes, you can use an updatedFoo lifecycle method (this is
>> a proprietary extension in felix 1.6 and included in the DS 1.2 spec).
>>
>
> I didn't introduce anything that wasn't in the 4.2 spec since that is all
> that is what is supported today. Once Felix 1.8 is available I am going to
> update the Karaf 2.3 code base and will reflect the changes at that time.
>
>
> the updated methods are available in felix 1.6. You just have to use the
> proprietary namespace http://felix.apache.org/xmlns/scr/v1.1.0-felix
>
>
>
>>
>> BTW I suggest you clarify that what you are calling managed services are
>> NOT ManagedService instances. I think this is why the spec doesn't call
>> them managed services.
>>
>>
> Excellent point. Will edit to clarify the difference.
>
>
>> I have yet to find a use for ComonentFactories, but you leave out the
>> extremely useful (to me :-) use of config admin to create multiple
>> instances of a component using a factory.pid. To me the best analogy for
>> ComponentFactory is that it's like using config admin with a factory pid,
>> but your code takes over the role of config admin, supplying and removing
>> the configurations.
>>
>
> That is what I was hinting at with my final comments. There are so many
> great use cases but I just needed to get this published as I have been
> staring at it for a week now. :)
>
> I think that my next series which covers using Camel with DS & Karaf I
> will be able to illustrate a more robust set of use cases.
>
>
>>
>> Nice work!!
>> thanks
>> david jencks
>>
>>
> Thanks again for the taking the time to play "editor".
>
>
> np. Thanks for taking the time to document this very useful but not well
> documented and often surprisingly confusing functionality!
>
> david jencks
>
>
>
>>
>> On Sep 16, 2012, at 7:53 PM, Scott England-Sullivan wrote:
>>
>> Hello All,
>>
>> Just finished and published a 4 part series on Declarative Services with
>> Karaf. Its is a primer on both DS and how it behaves with the new Karaf
>> SCR Command Components.
>>
>> Comments and questions welcome.
>>
>> Best Regards,
>> Scott ES
>>
>> Declarative Services with Karaf http://bit.ly/QShfyY
>>
>> --
>> --
>> Scott England-Sullivan
>> ----------------------------------
>> Principal Consultant | Red Hat, Inc.
>> FuseSource is now part of Red Hat
>> Web: http://www.fusesource.com | http://www.redhat.com
>> Blog: http://sully6768.blogspot.com
>> Twitter: sully6768
>>
>>
>>
>
>
> --
> --
> Scott England-Sullivan
> ----------------------------------
> Principal Consultant | Red Hat, Inc.
> FuseSource is now part of Red Hat
> Web: fusesource.com <http://www.fusesource.com/> |
> redhat.com<http://www.redhat.com/>
> Blog: sully6768.blogspot.com
> Twitter: sully6768
>
>
>
--
--
Scott England-Sullivan
----------------------------------
Principal Consultant | Red Hat, Inc.
FuseSource is now part of Red Hat
Web: fusesource.com <http://www.fusesource.com> |
redhat.com<http://www.redhat.com>
Blog: sully6768.blogspot.com
Twitter: sully6768