Indeed. The server guys in my team make fun of me :( 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
