I think it comes down to the same rule: measure ... There are only 3 impls I 
think: Knopflerfish, Apache Felix, and Equinox.

If you measure them, I think it would be great to have a blog about it ...

Kind regards,

        Peter Kriens

On 24 sep. 2013, at 10:03, Daniel McGreal wrote:

> Incidentally, is it known which implementation is considered to use resources 
> most conservatively?
> Many thanks,
> Dan.
> 
> On 24 Sep 2013, at 08:52, Peter Kriens wrote:
> 
>> The problem is that solving the DS problem (managing your dependencies etc) 
>> is going to take space in your app code. So I can see it would be an 
>> overhead for 1 bundle, but at a certain point you get a lot less 
>> classes/space. And if you have only one bundle, OSGi does not make a lot of 
>> sense :-)
>> 
>> As always in these cases, you have to measure it ...
>> 
>> Kind regards,
>> 
>>      Peter Kriens
>> 
>> 
>> On 21 sep. 2013, at 01:03, [email protected] wrote:
>> 
>>>> Indeed.
>>>> The server guys in my team make fun of me :(
>>> 
>>> Ignore them - they're just a bunch of quiche-eaters. ;-)
>>> 
>>> Peter, it's not just the size of the jar file which counts (75k for
>>> knopflerfish SCR BTW), it's the memory usage at runtime - which is going
>>> to be more than that[1], and RAM is usually even scarcer than filesystem
>>> space.
>>> 
>>> [1] To the extent that classes are loaded from the jarfile, the
>>> representation of these classes in memory will typically be somewhat
>>> larger than the jar entry after the later is decompressed. And while
>>> Daniel's "server guys" may quite often put some huge open-source library
>>> on their classpath just to use one class, OSGi services tend to have a
>>> high degree of cohesion so the chances are that pretty well all of the jar
>>> file gets loaded ...
>>> 
>>> Which is not to deny that DS is mankind's coolest invention since OSGi
>>> itself ...
>>> 
>>> Kind regards
>>> 
>>> Chris Gray
>>> 
>>>> On 20 Sep 2013, at 16:37, Peter Kriens wrote:
>>>> 
>>>>> On 19 sep. 2013, at 20:25, Daniel McGreal wrote:
>>>>>> Space constraints.
>>>>> Wow! You must code in a tightly constrained embedded environment if 195k
>>>>> is too much for something soooo valuable .... :-)
>>>>> 
>>>>> Kind regards,
>>>>> 
>>>>>   Peter Kriens
>>>>> 
>>>>> 
>>>>> 
>>>>>> 
>>>>>> On 19 Sep 2013, at 18:55, Peter Kriens <[email protected]> wrote:
>>>>>> 
>>>>>>> Why not use DS?
>>>>>>> 
>>>>>>> 
>>>>>>> On 19 sep. 2013, at 18:02, Daniel McGreal wrote:
>>>>>>> 
>>>>>>>> Hi OSGi-devs,
>>>>>>>> 
>>>>>>>> I have a question about utilising ServiceTracker to manage a class's
>>>>>>>> dependencies and blocking during the call, which I confess is
>>>>>>>> probably well trodden ground but for which I can't apparently find
>>>>>>>> the right Google terminology. Perhaps because I've been, until now,
>>>>>>>> coddled by higher-level service dynamism, like Blueprint.
>>>>>>>> 
>>>>>>>> I have a java.util.logging.Handler whose publish method needs a
>>>>>>>> couple of OSGi services to operate. Any LogRecords that are published
>>>>>>>> during a refresh of either of the dependencies should not be lost and
>>>>>>>> should be reattempted when services resume (which in practice might
>>>>>>>> be a long time, the device this application targets is incredibly
>>>>>>>> primitive).
>>>>>>>> 
>>>>>>>> Currently I have the Activator and Handler in the same implementation
>>>>>>>> (which seems like it might be bad practice, if it is, I'd love to
>>>>>>>> know why). Here's a trimmed down version, with just one dependency:
>>>>>>>> 
>>>>>>>> public class RemoteLoggingHandler extends Handler implements
>>>>>>>> BundleActivator {
>>>>>>>>        private volatile Channel channel;
>>>>>>>> 
>>>>>>>>        private ServiceTracker<IAmqpChannelProvider, 
>>>>>>>> IAmqpChannelProvider>
>>>>>>>> channelProviderTracker;
>>>>>>>> 
>>>>>>>>        @Override public void start(BundleContext context) throws 
>>>>>>>> Exception
>>>>>>>> {
>>>>>>>>                channelProviderTracker = new 
>>>>>>>> ServiceTracker<IAmqpChannelProvider,
>>>>>>>> IAmqpChannelProvider>(context, IAmqpChannelProvider.class, null){
>>>>>>>>                        @Override public IAmqpChannelProvider
>>>>>>>> addingService(ServiceReference<IAmqpChannelProvider> reference) {
>>>>>>>>                                IAmqpChannelProvider channelProvider =
>>>>>>>> super.addingService(reference);
>>>>>>>>                                try {
>>>>>>>>                                        channel = 
>>>>>>>> channelProvider.createChannel();
>>>>>>>>                                        //Some initialisation, can 
>>>>>>>> happen once or multiple times, no
>>>>>>>> problem.
>>>>>>>>                                        
>>>>>>>> channel.exchangeDeclare(LoggingConstants.LOGGING_EXG_NAME,
>>>>>>>> "topic", true);
>>>>>>>>                                        notifyAll();
>>>>>>>>                                } catch (IOException e) {
>>>>>>>>                                        e.printStackTrace();
>>>>>>>>                                }
>>>>>>>>                                return channelProvider;
>>>>>>>>                        }
>>>>>>>> 
>>>>>>>>                        @Override public synchronized void
>>>>>>>> modifiedService(ServiceReference<IAmqpChannelProvider> reference,
>>>>>>>> IAmqpChannelProvider service) {
>>>>>>>>                                removedService(reference, service);
>>>>>>>>                                addingService(reference);
>>>>>>>>                        }
>>>>>>>> 
>>>>>>>>                        @Override public void
>>>>>>>> removedService(ServiceReference<IAmqpChannelProvider> reference,
>>>>>>>> IAmqpChannelProvider service) {
>>>>>>>>                                super.removedService(reference, 
>>>>>>>> service);
>>>>>>>>                                channel = null;
>>>>>>>>                        }
>>>>>>>>                };
>>>>>>>>                channelProviderTracker.open();
>>>>>>>> 
>>>>>>>>                
>>>>>>>> LogManager.getLogManager().getLogger("").addHandler(this);
>>>>>>>>        }
>>>>>>>> 
>>>>>>>>        @Override public void stop(BundleContext context) throws 
>>>>>>>> Exception {
>>>>>>>>                
>>>>>>>> LogManager.getLogManager().getLogger("").removeHandler(this);
>>>>>>>>        }
>>>>>>>> 
>>>>>>>>        @Override
>>>>>>>>        public void publish(LogRecord record) {
>>>>>>>>                try {
>>>>>>>>                        synchronized (channelProviderTracker) {
>>>>>>>>                                while(channel == null) 
>>>>>>>> channelProviderTracker.wait();
>>>>>>>> 
>>>>>>>>                                
>>>>>>>> channel.basicPublish(LoggingConstants.LOGGING_EXG_NAME,
>>>>>>>> record.getLoggerName(),
>>>>>>>>                                                null, 
>>>>>>>> record.getMessage().getBytes());
>>>>>>>>                        }
>>>>>>>>                } catch (Exception e) {
>>>>>>>>                    reportError(null, e, ErrorManager.WRITE_FAILURE);
>>>>>>>>                    return;
>>>>>>>>                }
>>>>>>>>        }
>>>>>>>> 
>>>>>>>>        //Some boilerplate....
>>>>>>>> 
>>>>>>>>        @Override public void flush() {} //Unnecessary.
>>>>>>>> 
>>>>>>>>        @Override
>>>>>>>>        public void close() throws SecurityException {
>>>>>>>>                flush();
>>>>>>>>                try {
>>>>>>>>                        channel.close();
>>>>>>>>                } catch (IOException e) {
>>>>>>>>                        reportError("Amqp channel could not be closed", 
>>>>>>>> e,
>>>>>>>> ErrorManager.CLOSE_FAILURE);
>>>>>>>>                }
>>>>>>>>        }
>>>>>>>> 
>>>>>>>> }
>>>>>>>> 
>>>>>>>> I don't feel that I've been successful. The channel member field can
>>>>>>>> still go to null while it's being used in publish, and probably many
>>>>>>>> other problems I've missed! Can anyone point out to me either the
>>>>>>>> standard procedure for this, or any comments on my above attempt?
>>>>>>>> 
>>>>>>>> Many thanks,
>>>>>>>> Dan.
>>>>>>>> 
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> OSGi Developer Mail List
>>>>>>>> [email protected]
>>>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>> 
>>>>>>> _______________________________________________
>>>>>>> OSGi Developer Mail List
>>>>>>> [email protected]
>>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> [email protected]
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>> 
>>>>> _______________________________________________
>>>>> OSGi Developer Mail List
>>>>> [email protected]
>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>> 
>>>> _______________________________________________
>>>> OSGi Developer Mail List
>>>> [email protected]
>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>> 
>>> 
>>> _______________________________________________
>>> OSGi Developer Mail List
>>> [email protected]
>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>> 
>> _______________________________________________
>> OSGi Developer Mail List
>> [email protected]
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
> 
> _______________________________________________
> OSGi Developer Mail List
> [email protected]
> https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to