BTW, a very nice way of handling this queuing (i.e. async) might be OSGi
promises!

- Ray

On Tue, Jan 24, 2017 at 3:39 PM, Raymond Auge <raymond.a...@liferay.com>
wrote:

>
>
> On Tue, Jan 24, 2017 at 3:23 PM, Tim Jones <tim.jo...@mccarthy.co.nz>
> wrote:
>
>> Okay let's say for example that incoming data needs to stored in separate
>> database schemas/partitions depending upon some value within the data. We
>> don't know in advance what these values are so we can't pre create the
>> schemas/partitions before server startup, so instead when a new value
>> arrives we create the database schema/partition and tables, functions,
>> assign roles etc, then create an associated JPA persistence unit +
>> dependent services.
>>
>
> I'd be very hesitant to have all this work be the result of a single
> method call. Sounds scary!
>
> I'd probably do something like:
> - identify that a schema is needed by looking at the data
> - queue schema creation up in a schema queue
> - queue up the data in data queue
> - schema queue consumer does all that setup work, or if it had already
> been done, skip it
> - once ready create a data queue consumer
> - data queue consumer notices its data in the queue and process it
>
> Just an idea!
> - Ray
>
>
>
>>
>> Tim
>>
>>
>> ------------------------------
>> *From: *"Raymond Auge" <raymond.a...@liferay.com>
>> *To: *"OSGi Developer Mail List" <osgi-dev@mail.osgi.org>
>> *Sent: *Wednesday, 25 January, 2017 12:09:17 PM
>>
>> *Subject: *Re: [osgi-dev] How to determine when a new service instance
>> has        been activated?
>>
>>
>>
>> On Tue, Jan 24, 2017 at 3:08 PM, Raymond Auge <raymond.a...@liferay.com>
>> wrote:
>>
>>>
>>>
>>> On Tue, Jan 24, 2017 at 3:00 PM, Tim Jones <tim.jo...@mccarthy.co.nz>
>>> wrote:
>>>
>>>> Ray can you please explain a little more what you mean by 'manifest the
>>>> schemas'? One thing I should have said is we don't know in advance of
>>>> server startup as to what schemas will be needed.
>>>>
>>>> BTW I have read http://www.coding-dude.com/wp/
>>>> java/liferay/liferay-multi-tenancy-setup-with-shards/
>>>>
>>>
>>> That article is a little dated but it's fine :)
>>>
>>> What I mean to suggest is that rather than having creation of schema be
>>> a side effect caused by some method call, it could probably be better
>>> modelled by some agent specializing in schema who once it's built a schema
>>> exposes it as an OSGi service.
>>>
>>> This way other components interested in schema can have real service
>>> dependencies on those concert services.
>>>
>>
>> auto-correct gaf: ...schema services...
>>
>>
>>>
>>> I hope that is a little more clear.
>>>
>>> However, I've been slightly confused by the implication of your
>>> statement:
>>> > we don't know in advance of server startup as to what schemas will be
>>> needed
>>>
>>> My question to that is; isn't that a function of somebody providing one
>>> or not Otherwise, I can't see how you'd magically get a schema as a result
>>> of a function call? To me that feels a little reverse. I think the schema
>>> should arrive and then others who may need it would be satisfied or not.
>>>
>>> - Ray
>>>
>>>
>>>
>>>>
>>>>
>>>> Tim
>>>>
>>>>
>>>> ------------------------------
>>>> *From: *"Raymond Auge" <raymond.a...@liferay.com>
>>>> *To: *"OSGi Developer Mail List" <osgi-dev@mail.osgi.org>
>>>> *Sent: *Wednesday, 25 January, 2017 11:20:37 AM
>>>>
>>>> *Subject: *Re: [osgi-dev] How to determine when a new service instance
>>>> has        been activated?
>>>>
>>>>
>>>>
>>>> On Tue, Jan 24, 2017 at 2:17 PM, Tim Jones <tim.jo...@mccarthy.co.nz>
>>>> wrote:
>>>>
>>>>> Actually the remote service still calls the same 'top level' component
>>>>> but it is this component that will make the choice as to which set of
>>>>> instance of services are ultimately exercised. At the risk of going too 
>>>>> far
>>>>> off topic but to illustrate the requirement, the application is a
>>>>> multi-tenant system that needs to be able to create and access new db
>>>>> schemas on the fly. I don't wont the call to create the new db schemas and
>>>>> the associated services to return until they have been created.
>>>>>
>>>>
>>>> A nice way to do this is to flip the problem on it's head and manifest
>>>> the schemas, once ready, as a services and have interested components
>>>> declare references to those services.
>>>>
>>>> - Ray
>>>>
>>>>
>>>>
>>>>> Tim
>>>>>
>>>>>
>>>>>
>>>>> ------------------------------
>>>>> *From: *"Christian Schneider" <ch...@die-schneider.net>
>>>>> *To: *"OSGi Developer Mail List" <osgi-dev@mail.osgi.org>
>>>>> *Sent: *Wednesday, 25 January, 2017 11:01:20 AM
>>>>>
>>>>> *Subject: *Re: [osgi-dev] How to determine when a new service
>>>>> instance has        been activated?
>>>>>
>>>>> If the call is via jms then you should only start the route (and so
>>>>> the jms listener) once the service is injected.
>>>>> Christian
>>>>>
>>>>> 2017-01-24 22:45 GMT+01:00 Tim Jones <tim.jo...@mccarthy.co.nz>:
>>>>>
>>>>>> Yes the call is made by a component with the injected service and the
>>>>>> service reference is mandatory but the initiating call to the component 
>>>>>> is
>>>>>> from a remote system e.g.
>>>>>>
>>>>>> Remote system ---- (via Camel/JMS) ----> to component(s) which
>>>>>> reference the newly created service
>>>>>>
>>>>>> Tim
>>>>>>
>>>>>>
>>>>>> ------------------------------
>>>>>> *From: *"Neil Bartlett" <njbartl...@gmail.com>
>>>>>> *To: *"OSGi Developer Mail List" <osgi-dev@mail.osgi.org>
>>>>>> *Sent: *Wednesday, 25 January, 2017 9:55:34 AM
>>>>>>
>>>>>> *Subject: *Re: [osgi-dev] How to determine when a new service
>>>>>> instance        has        been activated?
>>>>>>
>>>>>> Who makes the call to the newly published service? If it is a
>>>>>> component with an injected service, then just make the service reference
>>>>>> mandatory. The component will then not be *able* to call the first 
>>>>>> service
>>>>>> until it is actually published.
>>>>>>
>>>>>> Most of these timing and ordering problems disappear when you break
>>>>>> the system down into components with injected service references. The DS
>>>>>> runtime takes care of the underlying complexity and gives you a simple
>>>>>> guarantee: for as long as your component is active, it can use its 
>>>>>> injected
>>>>>> services without worrying about whether they are available yet and/or 
>>>>>> still
>>>>>> available.
>>>>>>
>>>>>> Neil
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 24 Jan 2017, at 20:42, Tim Jones <tim.jo...@mccarthy.co.nz> wrote:
>>>>>>
>>>>>> Thanks Neil and Christian,
>>>>>>
>>>>>> I may be going about this the wrong way but the service is ultimately
>>>>>> injected into other components as you have suggested Christian. But, I
>>>>>> don't want to return until the target service has been activated (and 
>>>>>> then
>>>>>> hopefully fairly quickly referenced by other services) as the programatic
>>>>>> call to ConfigurationAdmin.createFactoryConfiguration() is from a
>>>>>> remote system and the next remote call will be to the services that have
>>>>>> references to this newly published/activated service. If the next remote
>>>>>> call is too soon the call would regularly fail as the service would not
>>>>>> have been activated yet. While I acknowledge the next remote call can 
>>>>>> still
>>>>>> fail I would rather this was the exceptional case.
>>>>>>
>>>>>> Tim
>>>>>>
>>>>>>
>>>>>>
>>>>>> ------------------------------
>>>>>> *From: *"Neil Bartlett" <njbartl...@gmail.com>
>>>>>> *To: *"OSGi Developer Mail List" <osgi-dev@mail.osgi.org>
>>>>>> *Sent: *Monday, 23 January, 2017 11:18:54 PM
>>>>>> *Subject: *Re: [osgi-dev] How to determine when a new service
>>>>>> instance has        been activated?
>>>>>>
>>>>>> I agree with Christian but would add an exception to his rule… using
>>>>>> ServiceTracker.waitForService() is useful when writing unit tests.
>>>>>> The other options such as adding fixed-length sleeps are unreliable and
>>>>>> seriously damage the performance of your test runs.
>>>>>>
>>>>>> Neil
>>>>>>
>>>>>>
>>>>>> On 23 Jan 2017, at 06:26, Christian Schneider <
>>>>>> ch...@die-schneider.net> wrote:
>>>>>>
>>>>>> This exactly the expected behaviour. The @Activate method allows the
>>>>>> component to configure itself. The service of the component will only be
>>>>>> published when the @Activate method has finished. If it would be 
>>>>>> published
>>>>>> earlier then the service might be in an invalid state.
>>>>>> Btw. You should avoid using waitForService. Instead override the
>>>>>> addedService method of ServiceTracker and continue your initialization 
>>>>>> only
>>>>>> when the service is present. Even better just inject the servcie into
>>>>>> another @Component.
>>>>>>
>>>>>> Christian
>>>>>>
>>>>>> 2017-01-22 21:14 GMT+01:00 Tim Jones <tim.jo...@mccarthy.co.nz>:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> I am after some advice on the following.
>>>>>>>
>>>>>>> In general terms the problem is if a new instance of a service is
>>>>>>> created via a programatic call to 
>>>>>>> ConfigurationAdmin.createFactoryConfiguration(),
>>>>>>> what options do I have to determine that this new service instance has 
>>>>>>> been
>>>>>>> activated considering the call to  .createFactoryConfiguration() returns
>>>>>>> immediately.
>>>>>>>
>>>>>>> I have tried setting up a service tracker with a filter for the
>>>>>>> specific instance of the service but I am not sure I understand the
>>>>>>> expected behavior of the .waitForService() method. For a small timeout
>>>>>>> period e.g. 1ms the call to .waitForService() returns with a null 
>>>>>>> service
>>>>>>> as I would expect. For a longer timeout period e.g. 1000ms the call to
>>>>>>> .waitForService() returns with non null service and from the logs I can 
>>>>>>> see
>>>>>>> that it seems to return only after the tracked service has returned from
>>>>>>> the @Activate method, is this the expected behavior?
>>>>>>>
>>>>>>> I also tried adding a sleep for 0.5 sec in the @Activate method of
>>>>>>> the tracked service and the .waitForService() still only returned after 
>>>>>>> the
>>>>>>> @Activate method of that service had returned. Does the registration of 
>>>>>>> a
>>>>>>> service have any dependency on its activation in the context of 
>>>>>>> Declarative
>>>>>>> Services? Note the tracked service has @Component(immediate = true)
>>>>>>>
>>>>>>> Although the behavior is what I am after ie .waitForService() only
>>>>>>> seems to return after the tracked service has activated I am wondering 
>>>>>>> if I
>>>>>>> am just getting lucky in this case.
>>>>>>>
>>>>>>>
>>>>>>> Regards,
>>>>>>> Tim Jones
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> OSGi Developer Mail List
>>>>>>> osgi-dev@mail.osgi.org
>>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> --
>>>>>> Christian Schneider
>>>>>> http://www.liquid-reality.de
>>>>>> <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.liquid-reality.de>
>>>>>>
>>>>>> Open Source Architect
>>>>>> http://www.talend.com
>>>>>> <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.talend.com>
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> osgi-dev@mail.osgi.org
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> osgi-dev@mail.osgi.org
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> osgi-dev@mail.osgi.org
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> osgi-dev@mail.osgi.org
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>
>>>>>> _______________________________________________
>>>>>> OSGi Developer Mail List
>>>>>> osgi-dev@mail.osgi.org
>>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> --
>>>>> Christian Schneider
>>>>> http://www.liquid-reality.de
>>>>> <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.liquid-reality.de>
>>>>>
>>>>> Open Source Architect
>>>>> http://www.talend.com
>>>>> <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.talend.com>
>>>>>
>>>>> _______________________________________________
>>>>> OSGi Developer Mail List
>>>>> osgi-dev@mail.osgi.org
>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>
>>>>> _______________________________________________
>>>>> OSGi Developer Mail List
>>>>> osgi-dev@mail.osgi.org
>>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
>>>>  (@rotty3000)
>>>> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
>>>>  (@Liferay)
>>>> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
>>>> (@OSGiAlliance)
>>>>
>>>> _______________________________________________
>>>> OSGi Developer Mail List
>>>> osgi-dev@mail.osgi.org
>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>
>>>> _______________________________________________
>>>> OSGi Developer Mail List
>>>> osgi-dev@mail.osgi.org
>>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>>>
>>>
>>>
>>>
>>> --
>>> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
>>>  (@rotty3000)
>>> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
>>>  (@Liferay)
>>> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
>>> (@OSGiAlliance)
>>>
>>
>>
>>
>> --
>> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
>>  (@rotty3000)
>> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
>>  (@Liferay)
>> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
>> (@OSGiAlliance)
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>
>
>
> --
> *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
>  (@rotty3000)
> Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
>  (@Liferay)
> Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org>
> (@OSGiAlliance)
>



-- 
*Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile>
 (@rotty3000)
Senior Software Architect *Liferay, Inc.* <http://www.liferay.com>
 (@Liferay)
Board Member & EEG Co-Chair, OSGi Alliance <http://osgi.org> (@OSGiAlliance)
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to