You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@felix.apache.org by "Gay David (Annecy)" <dg...@axway.com> on 2011/06/07 12:01:08 UTC
iPojo callback concurrent access
[PS : I post this message in the felix dev mailing list by error, that why I re-post it here, sorry]
Hi all,
Have a question about iPojo. I made a simple component like that :
@Component( name="My.Manager" )
@Instantiate
public class MyManagerImpl {
private boolean register;
private Set<ServiceReference> myservices;
public MyManagerImpl() {
register = false;
apis = new HashSet<ServiceReference>();
adapters = new HashMap<Long,ComponentInstance>();
}
@Validate
private void validate() {
for( ServiceReference ref : myservices ) {
install( ref );
}
register = true;
}
@Invalidate
private void invalidate() {
for( ServiceReference ref : myservices ) {
uninstall( ref );
}
register = false;
}
@Bind( id="services", aggregate=true, optional=true )
private void bindMyService( MyService srv, ServiceReference ref ) {
myservices.add( ref );
if( register ) {
install( ref );
}
}
@Unbind( id="services" )
private void unbindMyService( MyService srv, ServiceReference ref ) {
if( myservices.remove(ref) && register ) {
uninstall( ref );
}
}
@Modified( id="services" )
private void modifiedMyService( MyService srv, ServiceReference ref ) {
if( register ) {
uninstall( ref );
install( ref );
}
}
private void install( ServiceReference ref ) {
// bla bla ...
}
private void uninstall( ServiceReference ref ) {
// bla bla ...
}
}
At runtime, sometimes I have an exception :
2011-06-06 16:21:37,222 GMT+0200 - [Thread-3] ERROR (test.?:?) - [ERROR] My.Manager : [My.Manager-0] The callback method validate has thrown an exception : null
java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at test.MyManagerImpl.__validate(RestManagerImpl.java:78)
at test.MyManagerImpl.validate(RestManagerImpl.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.felix.ipojo.util.Callback.call(Callback.java:235)
at org.apache.felix.ipojo.util.Callback.call(Callback.java:191)
For what I understand, it means that the iteration over the collection in the validate() method is modified by another thread.
Is it possible that bind/unbind/validate/unvalidate callback method could be call concurrently ?
I don't find it clearly in the ipojo doc, but I understand that iPojo take care of that.
I'm wrong ? Do I have to synchronize myself ?
BTW : I'm currently using iPojo 1.6.4
Regards
David