Hi Neil,

Thanks for the tips.

> With regard to "testing bouncing", there are two sides to this question: the 
> component being bounced, and the other components that may be exposed to it 
> bouncing.
> 
> The component itself should never actually know that it is being, or has 
> been, bounced. SCR always creates a new instance for each activation…

Yeah, that was one of my learnings during this iteration. The simplicity of 
using a static component cannot be understated. By removing as much threading 
and dynamic components as possible, it makes the system **MUCH** more easy to 
reason, and at least in my case with no perceptible performance loss.


> The harder question is about components that deliberately expose themselves 
> to the bouncing of other components – in other words, they have dynamic 
> service references – and/or expose themselves to dynamic configuration 
> changes by having a modified method. Tim talked about components that require 
> heavyweight initialisation... to implement such a component you might write a 
> modify method to accept dynamic config changes and then internally implement 
> some kind of damping mechanism. This gets you into some slightly hairy 
> multithreading code.

Yeah… I’m trying to avoid that when possible.


> I don't have a good answer myself yet for testing this kind of code, it seems 
> like even the best available practices are still quite primitive and 
> probabilistic, e.g. running the same code thousands of times and hoping to 
> find an error. I would love to find something better.

I get the impression that the only thing to do is reason about the code. I am 
finding that there are two places where there is potential for things to go 
wrong: (1) concurrency due to “regular” multithreading and (2) when using 
promises. Concurrency is a little easier to reason, at least for me. I have 
tried to limit exposure to these risks as much as possible. I think I have this 
pretty much under control, but since I am relying on my ability to reason and 
don’t have a conclusive means of testing, I have no guarantee that I have not 
reasoned incorrectly.

As for promises, the bigger challenge is protecting against services that come 
and go. I am finding that dealing with these dynamics is more challenging than 
concurrency. However, by reducing multithreading (accepting synchronous 
processing as much as possible instead of worrying too much in advance about 
performance), I have greatly reduced these risks and, at least for now, the 
timing problems I was having. Although I understand that it is not good 
practice to linger too long in, for example, an activate method, by moving back 
“long” processes (in the order of a second or so) synchronously into the same 
thread, I have greatly simplified my system, at the expense of a startup time 
that is about 5-10 seconds slower. I can certainly live with that.

KISS


Thanks again.
=David


_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to