On Wed, Apr 30, 2008 at 1:00 AM, Peter Kriens <[EMAIL PROTECTED]> wrote:
> Regarding HttpService - I don't think it's a good idea for tomcat. > > One of the major problems with OSGI ( and we need to make sure we don't > > fall > > in this trap ) is the re-invention of common APIs - logging, servlet > > interfaces, etc. > > > As a bit of background. The logging and Http Service API are from 1999. At > that time > there was no dominant common logging API (neither in Java SE nor in open > source), > and the Http Service API is 100% based on the, at that time, standard > Servlet API (it > uses javax.servlet.http), it only provides an API to dynamically register > and unregister > servlets, which is still lacking in the current Servlet API. Regarding 'dynamic register/unregister' - the servlet API defines one way to do this, i.e. war and the deployment. There is no standard API to install/uninstall/start/stop a .war - but HttpService is not that either. Runtime config changes ( adding/removing servlets without web.xml changes and re-deployment ) is not specified, but it's a whole different discussion for the JSR people to solve, I'm pretty sure it'll be different from HttpService. It would be quite inappropriate for tomcat to not use the standard > > deployment/configuration mechanism for > > servlets. So using or implementing any of the OSGI-re-defined service > > interfaces in > > tomcat would be a hard sale IMO. > > > > Well, I do not see that this is an dichotomy. By nature of being the RI, > you must follow the > JSR. However, it would not be hard to provide the Http Service as an > additional component. If > Tomcat provides an API to dynamically register servlets, it would be > trivial for someone > to provide an OSGi compatibility bundle, just like people are doing it > today. > But it would be a nice service to get this from the horse's mouth. I am > sure people are willing > to provide this code. > A lot of people would like for tomcat to provide more jetty-like APIs for programmatic configuration ( and in a way it is already possible - just not easy ). As an API, HttpService is way off - in '99 and servlet 2.1 it may have been valuable. Let's keep HttpService for a different discussion :-) > In reality, this is a rather crude approach because in well designed > systems the coupling between bundles > is minimal. At this point in time, services usually start to look more > attractive because they provide > an API to allow dynamic updates without crudely stopping all bundles in > the module dependency > graph (which in non-service based systems, and especially require-bundle > based systems tends > to become the whole system). And a service is just a POJO that is > registered under one or more interfaces. By allowing > it to withdrawn at any moment in time, as well as registered by multiple > independent parties, OSGi > provides a good abstraction of this dynamism. And there is no Java > counterpart for this. > Actually - JMX provides a lot of this dynamism. Tomcat is using a lot of JMX ( and hopefully will use more ), and provide very similar model with OSGI services. > they fell in love and the service layer was a major part of their > infatuation. They > realized very quickly how they could leverage the services as beans in > their model and the > advantages of dynamism without rebooting. To clarify: updating webapps in tomcat without rebooting has been around for many years :-). Webapps are quite similar with the bundles - it would be interesting to see if we could use OSGI classloader instead of ours, but I don't think that's a real problem. People are looking for 'gapless' restart, i.e. users who have an active session continuing to use the old version ( or some magic way to migrate the session - but that's likely impossible in most real cases, i.e. if code changes happen ). OSGi alone can't solve this. A whole different class of users would like to see _less_ dynamism - i.e. embedding tomcat as a jar and using simple APIs and no class loaders or config files. In both high-end servers and low-end embedding this is a very important use case. The problem I would like to see solved in tomcat is breaking it up in modules - i.e. separating all the optional parts and having a way to ship a really minimal core and a good way to release and deploy add-on bundles. OSGi may be a good way to do this. I think the requirements are: - provide a way for different tomcat components and core to be packaged as OSGi bundles, using manifests and maybe optional activators if it can't be avoided ( as long as tomcat doesn't depend on it ). I think this is an easy sell, I can't think of any good technical reasons not to do it. - break tomcat release ( for 7.0 or 6.5 or whatever trunk will be released as ) into just core ( minimal servlet impl ) and bundles - find a easy way for people to download/install all modules they want. - integrate this with the JMX layer and the manager servlet - all this without a hard dependency on OSGI - for people who want 'one big jar' for embedding ( we don't want to force them to use osgi - or be dynamic - if they don't have a need for this) I think 'more dynamism' is a good thing - but so is 'less dynamism', both are valid goals and we can and should support both. ( right now we're somewhere in the middle - don't really support either one well enough ) Is there a way for a bundle to declare that it implements some services > using manifest or some config file, but without requiring it to be started > to register > services via BundleContext ? What I would like is to start tomcat, use > server.xml > to find what services are needed, and load the bundles providing the > modules > ( and only those ). > This is the use case of Declarative Services. The Service Component Runtime > (SCR) > will inspect the bundle when it gets installed and register any services > that > are declared and which have their dependencies on other services > satisfied. Any pointer to the docs ? If it only involves declarative stuff ( xml, manifest ) and is done at install time - it may work for us. Having a bundle start just to declare they provide a service (that won't be used) is a non-starter. The current model in tomcat is to use Class.forName to load components using server.xml - only the code that is used is started. I don't think it'll be acceptable to replace server.xml or use OSGi for configuration ( in particular when JMX is a better solution for many config problems ). > The OSGi manifest does have a header Export-Service and Import-Service > defined but because > you can't give an guarantees about them without running the bundle, we > decided to deprecate them. Too bad :-) > > However, how much do you want to be in the business of deployment? Tomcat > is very often used > as an application server but the web site tells me your core is a Servlet > and > JSP implementation. Tomcat is in the business of deployment and configuration of WAR files - that's a core part of the spec. > If you are going for strict modularity, wouldn't it make sense to > distinguish > between these core functions; Aren't the application management aspects > secondary? I.e. > allow your core JSP and Servlet engines to be used by others that provide > the deployment > aspects and allow your deployment code to be able to use other web service > providers? How > can you leverage existing deployment servers and management agents? For me > the key thing about > modularity is to do as little as possible and focus on core business. Sure - the core business of tomcat is to deploy/configure/run WAR files conforming to the spec. The biggest problems ( IMO ) facing tomcat are: - it needs more modularity in terms of its own extensions ( connectors, auth, session managers, etc ). - it needs to be easier to embed - both dynamically and as 'one big jar' ( or jetty-style ). For both OSGi could help. ( well, we also have some social problems from time to time :-) Costin