Hi Ray, I guess you are right!
I used Blueprint in our last software projects because I prefer constructor injection and I was attracted by the convenience of its dynamic proxies. This overshadowed the beauty of DS J. But obviously DS enables more control over service dynamic. Thanks for your advice. Best regards, Andreas -----Ursprüngliche Nachricht----- Von: Raymond Auge <raymond.a...@liferay.com <mailto:raymond.a...@liferay.com> > Gesendet: Mi 25.03.2015 15:44 Betreff: Re: [osgi-dev] persistence, lazy loading and service dynamic (Andreas Klotz) Anlage: inline.txt An: OSGi Developer Mail List <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> >; Would you really need a subsystem though? For instance, if you have a service graph based on DS where the outermost component is reachable to the user, and the lowest level is something that could go away, with properly defined relationships (i.e. the most basic being all static references) the outer most would technically go away before the lowest level actually does. This is the beautiful nature of DS. It's not like you're tearing away layers from the inside... it's kind of like peeling an onion! Am I mistaken? - Ray On Wed, Mar 25, 2015 at 9:58 AM, Andreas Klotz <andreas.kl...@n-design.de <mailto:andreas.kl...@n-design.de> > wrote: Hi Hervé, thank you for your comprehensive response. My conclusion concerning service dynamic is to deal with it in two different ways: 1. Case: The service represents a feature of an application and is on the top level of my layered architecture. If I stop the service, I want my GUI to disable the feature so that Users are aware that the service is not available. I want my application to handle service dynamic as “switch on / switch of” off features. 2. Case: The service represents a lower architectural layer (e.g. persistence layer as part of a feature). If this service is stopped without stopping the layers above an unsuccessful call is treated as a runtime failure (e.g. database not reachable). So as Chris an Peter said, in any of these cases I expect that a service call can fail and the software has to deal with it. Additionally I want my application to react actively on disabling certain features. To achieve this I try to group all bundles belonging to a feature in a subsystem. Best Regards, Andreas Von: osgi-dev-boun...@mail.osgi.org <mailto:osgi-dev-boun...@mail.osgi.org> [mailto:osgi-dev-boun...@mail.osgi.org <mailto:osgi-dev-boun...@mail.osgi.org> ] Im Auftrag von "hervé vivien" Gesendet: Dienstag, 24. März 2015 16:00 An: osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> Betreff: [osgi-dev] persistence, lazy loading and service dynamic (Andreas Klotz) Sent: Sunday, March 15, 2015 at 5:00 PM From: osgi-dev-requ...@mail.osgi.org <mailto:osgi-dev-requ...@mail.osgi.org> To: osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> Subject: osgi-dev Digest, Vol 101, Issue 24 Send osgi-dev mailing list submissions to osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> To subscribe or unsubscribe via the World Wide Web, visit https://mail.osgi.org/mailman/listinfo/osgi-dev or, via email, send a message with subject or body 'help' to osgi-dev-requ...@mail.osgi.org <mailto:osgi-dev-requ...@mail.osgi.org> You can reach the person managing the list at osgi-dev-ow...@mail.osgi.org <mailto:osgi-dev-ow...@mail.osgi.org> When replying, please edit your Subject line so it is more specific than "Re: Contents of osgi-dev digest..." Today's Topics: 1. persistence, lazy loading and service dynamic (Andreas Klotz) ---------------------------------------------------------------------- Message: 1 Date: Sat, 14 Mar 2015 17:41:33 +0100 From: Andreas Klotz <andreas.kl...@n-design.de <mailto:andreas.kl...@n-design.de> > To: osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> <osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> > Subject: [osgi-dev] persistence, lazy loading and service dynamic Message-ID: <zarafa.550464bd.528b.4aa9fb7f20b70...@s15865907.onlinehome-server.info <mailto:zarafa.550464bd.528b.4aa9fb7f20b70...@s15865907.onlinehome-server.info> > Content-Type: text/plain; charset="utf-8" Hi all, ? I have an use case where I want the dynamic of a service to be bound to another higher level service. Maybe I need Subsystems...? ? I think it is a good design of an OSGi-service if it just provides data in contrast to provide objects on which an operation can be performed that is using resources of the underlying bundle. Although the second variant would be possible, I think that handling service/bundle dynamic becomes very complex or even unmanageable. ? However there is a use case where I can't deliver just data by a service. I think of lazy loading when dealing with persistence. I usually define interfaces for the data access layer. So I get a Bundle-Setting like this: ? - Entity-Bundle (contains Entities) - DataAccessAPI-Bundle (contains DAO-Interfaces) - DataAccessImpl-Bundle (provides Services implementing DAO-Interfaces) - DomainService_A-Bundle (contains domain Logic for e.g. a GUI, uses DAO-Services; would be separated in API and impl of course) - DomainService_B-Bundle (contains more domain Logic, uses same DAO-Services as DomainsService_A) ? DomainServices A and B are clients of DAO-Services. A DAO-Service may provide an entity with some lazy loading properties. The transactions of the data accesses are defined by the DomainServices. So it may occur, that a call by the DomainsService on a property of an entity happens when the DAO-Service is not available anymore. That would lead to an unsuccessful attempt to load the property lazily (assuming that connections to the database are managed by the DAO-Bundle and not by a separate e.g. EntityManager-Service). So the DAO-Service delivered an object that tries to perform an operation on its delivering service. ? What options do I have to safely load the entities? - Do not use lazy Loading? I know cases where this would load the whole DB in to the RAM... - Make assumptions about certain properties a client might need and load them explicitly in the DAO-Layer? This will not work if I have different clients for one DAO-Service. - Is there a possibility to package DomainServices A and B as different Subsystems with the DAO-Service as a shared capability? Would this have the effect that the bundle providing the DAO-Service will only be stoppable, if both DomainServices are stopped? ? To be more general: In our OSGi-projects we use micro-services intensely to loosely couple not only domain logic (vertical) but also the architectural layers (horizontal). And I often feel that I only want dynamic for the vertical bundles/services. ? I am very interested in your opinion and how you deal with lazy loading or equivalent cases. ? Thanks and best regards, ??????????????? Andreas -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.osgi.org/pipermail/osgi-dev/attachments/20150314/a7b2eca1/attachment-0001.html <http://mail.osgi.org/pipermail/osgi-dev/attachments/20150314/a7b2eca1/attachment-0001.html> > ------------------------------ _______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org> https://mail.osgi.org/mailman/listinfo/osgi-dev End of osgi-dev Digest, Vol 101, Issue 24 ***************************************** Hi dear Andreas, sorry for responding to you so late on this topic "persistence, lazy loading and service dynamic". hint: please do enumerate your problems or your questions, so as to simplify,clarify them to us readers. Let's Try to summarize your requests if possible, to relevantly meet your needs. 1- I want the dynamic of a service to be bound to another higher level service 2- provides data in contrast to provide objects on which an operation can be performed 3- I can't deliver just data by a service. I think of lazy loading when dealing with persistence. 3.1-So the DAO-Service delivered an object that tries to perform an operation on its delivering service 4- What options do I have to safely load the entities? 5- This will not work if I have different clients for one DAO-Service. 6-Is there a possibility to package DomainServices A and B as different Subsystems with the DAO-Service as a shared capability? 6.1- Would this have the effect that the bundle providing the DAO-Service will only be stoppable, if both DomainServices are stopped? 7- And I often feel that I only want dynamic for the vertical bundles/services. 8- I am very interested in your opinion and how you deal with lazy loading or equivalent cases. MY OPINIONS: PART I : intro and fundamentals INTRO Implementing a system based on OSGI is a good choice.however one has to have in mind that OSGI is a specification, that is, being implemented differently by Container Providers (org.apache.felix,org.eclipse.equinox,etc.). e.g registering a service: hardcoded vs xml(blueprint,DS...). As you are organizing your system environment, make sure to be aware of some basic OSGI behavioural and structural fundamentals, as follow : OSGI fundamentals: - bundle, context, services platform - object (class) =/= bundle service =>(component->environment) - bundle -> modularisation, dependency - bundle service -> the externalization of some operations (services -> utility,domain or business) - lifecycle : bundle Activator (start/stop) =/= bundle service Activation and Registering (activate/deactivate, bind/unbind).NO INSTALLED = NO STARTED(ABLE) = NO USABLE - start-level: SL =/= lifecycle. WHEN START ? -> the start-up priority. e.g. who runs first to the bathroom (dad, mom, yoki,yaki...?) PART II : responses for enumerated questions 1- services are made to be bound to one another. But dynamically binding a service to another, you need org.osgi.util.ServiceTracker or SRC service runtime component (DS declararative service or blueprint). 2- an osgi service can be designed to provide any resources (data, simple entities, streams,files) to external worlds (other bundles). but first of all, your bundle has to declare the service(s) responsible for exchanging/communicating with other bundles, as of operations matter. e.g DAOservice 3- yes you can deliver just data by a service ----- class DAOImpl class DAOImpl impl DAOservice { @override List<Person> getData(){ //or List getData(){ to return any data //case sql statement while(resultSet.next){ personList.add(0,resultSet.getString("id")); personList.add(0,resultSet.getString("name")); personList.add(0,resultSet.getString("age")); personList.add(0,resultSet.getBoolean("sexy")); } //case entity persistence person = entityManager.find(object); or personList = entityManager.createQuery("sql").getResultList(); //here are data returned return personList; } } ----- class DomainService_B DAOservice daoService; dosomeThing(){ ////daoService or getDAOservice() //now get all data fetched apersonList= daoService.getData(); } //in case of DS implementation DAOservice getDAOservice(){ } 3.1 A service registered (published) by a bundle X , and referenced in another bundle Y can perform operations on its own objects or on any. please use a classic "interface" instead, to have an object perform an operation on it. e.g objectInBundleX.waitmeUP(ITimer), however in another bundle that referenced a service "TimerService", it may call objectInBundleY.waitmeUP(TimerService) {timerService.waikup()} 4- To safely load the entities: in a system, the architecture (information,application,technology,resource) and the workflow are critical.see 3, 3.1 and next. 5- you can have different clients served by a single service.The question is about the activities' domain and the State of that single service at a time in a domain activity. how many business (activities) domains you are dealing with. is that domain specific, private ? don't share its DAO. is that domain common ? don't run the risk of overlapping data in a domain. keep in mind the UNICITY of the information in a system. otherwise, build a stateless service, a utility service that get a new instance of an object needed... e.g. dao = new dao(); dao.loadDataByCustomer(customerID) 6- the subsystem DAO-Service bundled as a shared capability is a best practice design,But be careful to get new instance of that service or of some objects if necessary. separating the Logic from the UI is recommended, in each bundle is fully recommended and best practice. 6.1- it's not automatic to have that effect, see osgi spec. a bundle can stop/start anytime, as does (activate/deactivate) a service. a bundle lifecycle has precedence on service lifecycle. However if a service is running, stopping a bundle will issue errors in a system (dependence matters). and you set up osgi service's properties to automate how a service "component" will operate. 7- see PART I for OSGI fundamentals: OSGI bundle stands for Modularization.that's the master word. How the-way-NASA you want to design your system. Nowadays, modularizing a system infrastructure is for flexibility and agility.a system not modularized is like a concrete block, you must rebuild it once crashed impossible to see inside it, awful. e.g. the earth: you can not repair the sky alone, the sea alone.it <http://alone.it> 's a whole and not modularized, but deeply wise... vertical or horizontal, no matter. the question is what should be modularized, for what. response: maintenance, flexibility,agility, re-usability,responsibility, encapsulation,dynamics... e.g. to change a ui theme, to provide a new business's entity model, provide AOP support to a system, maintain the White House carpet,change a doctor,etc. 8- lazy loading data =/= lazy activating a service you mean lazy loading data. lazy vs eager first annotate your entity class's property : @Basic(fetch=FetchType.LAZY), if optional @Basic(fetch=FetchType.LAZY,optional=true) @Entity @Table(name="person") --- class Person @Basic(fetch=FetchType.LAZY) @Column(nullable=false, length=ten) private String name; I hope i help, best regards, _______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org <mailto: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