Jul 23 2008
Osgi Hibernate Spring-DM Sample
Introduction
I have developed a small sample to demonstrate how to use Hibernate in OSGi with Spring Framework and Spring-DM. The sample works in either Felix or Equinox. It builds with Maven 2 - the build process automatically downloads the Felix and Equinox jars so there is no need to install either framework separately.
Starting Hibernate in OSGi with the normal Hibernate SessionFactory would allow you to use Hibernate in OSGi - but that would not address the dynamic behavior that an OSGi system is capable of. This sample demonstrates how a Hibernate SessionFactory can be updated dynamically in an OSGi environment. You can dynamically add and remove entity classes to the Hibernate configuration by stopping and starting bundles that contribute clasess to the Hibernate configuration.
This implementation contains a small Swing UI which allows you to see which entity classes are present in the Hibernate configuration. The Swing UI also allows you to issue rudimentary SQL and HQL queries.
The solution is based on this OSGi and Hibernate blog entry by Peter Kriens. The design uses an entry in the manifest file to declaratively add classes to a Hibernate session using an extender model.
Get the code
To get the source code for the hibernate sample, use SVN:
svn checkout http://voluble.googlecode.com/svn/trunk/osgi-samples/hibernate/ osgi-hibernate-sample
Run the code
Run “mvn install” in the new osgi-hibernate-sample folder and see all projects build successfully.
The 2nd last project that builds is “integration-tests”, which uses Spring DM to run an integration test suite in an OSGi container. The integration tests are run against an in-process HSQLDB server.
The very last project that builds is “deployment”. This projects assembles all our project bundles and dependencies in the deployment/target/classes/ folder. It also adds a Equinox configuration file (configuration/config.ini) and Unix and Windows batch files, which allow you to run equinox and automatically load the full set of bundles from this project in a standalone environment.
When you start the standalone Equinox server (by running either equinox.cmd or equinox.sh in the osgi-samples/hibernate/deployment/target/classes folder), a Swing UI is displayed. Click on the “Show Hibernate Config” button to see the classes in the configuration.
When you start the standalone OSGi server (by running either felix.cmd, equinox.cmd, felix.sh or equinox.sh in the osgi-samples/hibernate/deployment/target/classes folder), a Swing UI is displayed. Click on the “Show Hibernate Config” button to see the classes in the configuration.
In Equinox: Type “ss” in the Equinox command window. You’ll see that bundles 28 and 29 are “resolved” but not active. Start one or either by executing “start 28″ and/or “start 29″.
In Felix: Type “ps” in the Felix command window. You’ll see that bundles 1 and 2 are “installed” but not active. Start one or either by executing “start 1″ and/or “start 2″.
Now go back to the Swing UI and click on “Show Hibernate Config” again to see which classes are present in the Hibernate configuration.
You can also view data by typing the HQL “from A1” and clicking “Execute HQL” (note that “from A1” is roughly the HQL equivalent of the SQL statement “select * from A1“). You should see “Rows returned: 0“.
To add data to the database, enter the SQL statement “insert into A1 values (1, ‘value A’,'value B’)” and press the “Execute SQL” button. Then run the HQL query “from A1″ again to see your data being retrieved using Hibernate. (You can also connect to the Database from a different tool (like DbVisualizer) using using the URL “jdbc:hsqldb:hsql://localhost/osgi-hibernate-sample”. The username should be “sa” and the password should be empty).
Understanding the code
With an OSGi application you can dynamically add, start, stop and remove bundles from the system. If these bundles contain entity classes which Hibernate should be able to persist, then the Hibernate configuration should be updated dynamically when the classes are added to or removed from the system.
Hibernate itself does not allow classes to be added to or removed from a SessionFactory instance (it needs to know about all entity classes when it is instantiated). Consequently we need to create a new SessionFactory whenever the list of entity classes changes in the Hibernate configuration.
This example demonstrates how OSGi bundles can dynamically add new classes to a Hibernate configuration. We start with a bundle that provides a Hibernate SessionFactory - other bundles can grab and use the SessionFactory to access a database. However, if a new bundle is installed and it contains new entity classes that are not yet in the SessionFactory configuration, then the SessionFactory must be recreated to update the configuration with the new classes.
If you always use a HibernateUtil helper class to get a fresh Hibernate SessionFactory right before using it (i.e., if you never store a local copy of the SessionFactory), then it’s straight forward to ensure that you are always working with an up-to-date SessionFactory. However, if you use Spring Framework to wire up your dao’s (data access objects) then it becomes more complicated to ensure that you get a reference to a most up-to-date SessionFactory.
In our sample, we access the SessionFactory via a proxy (called DynamicSessionFactory) which ensures that a SessionFactory with the most up-to-date configuration is always used. As such, the dao beans must be configured with a reference the dynamic session factory, instead of the usual Hibernate SessionFactory.
Module List
Here is a list of maven projects and modules to implement the solution:
| provision | This project downloads resources into the maven repository. The project does not generate a new artifact. |
| hibernate-classes | Assembles Hibernate classes into a new OSGi bundle |
| jta | Assembles javax.transaction into a new OSGi bundle |
| hsqldb | Assembles the HSQLDB jars a new OSGi bundle |
| hibernate-session | Provides a Hibernate SessionFactory that can be reconfigured dynamically during runtime - classes can be added to, or removed from the Hibernate configuration when bundles are started and stopped. This bundle exports a service, DynamicConfiguration, which other bundles can use to register their contributions to the SessionFactory. The bundle also exports a DynamicSessionFactory which should be used to create Hibernate sessions with the most up to date Hibernate configuration. |
| model-a | This bundle contributes an additional class (called “A1″) to the Hibernate configuration. It also provides a DAO service (called “A1Dao”) for this class. |
| model-b | This bundle contributes an additional class (called “B1″) to the Hibernate configuration. It also provides a DAO service (called “B1Dao”) for this class. |
| integration-tests | This bundle tests if a dynamically updated Hibernate Session can be used to create, read, update and delete objects of classes A1 and B1 in the database. |
| deployment | This project assembles all dependent bundles along with Windows and Unix batch files (felix.cmd, equinox.cmd, felix.sh and equinox.sh) and configuration files so you can very easily start all the bundles in Equinox either Felix |
| application | This bundle launches a Swing UI which allows you to execute HQL (Hibernate Query Language) commands and view the entities that the Hibernate session is currently aware of. |
Also see http://wiki.escapek.org/display/DEV/Hibernate+in+OSGi for more on the subject of OSGi & HIbernate.
Your article on OSGi - Spring is really great. Iam only a week old to OSGi, but learnt more from your articles. I would like to develop a web application comprising Tomcat, Apache Felix and OSGi. I need some guidance regarding this. Is there any possibility of getting a sample application based on the above combination? If possible, pls do help me in this regard, and for which I will be really grateful to you.
I downloaded the code and ran it…and its autmatically working great…thanks a lot for this code…
Just trying to understand..where is your
hbm.xml files that are required in hibernate ?
In bundle-context-osgi.xml (for model-a and model-b), the following line is commented out:
<!-- osgi:listener ref="dynamicConfigurationListener" bind-method="onBind" unbind-method="onUnbind"></osgi:listener -->
So, how does the dynamicConfigurationListener get hooked up with it’s bundle?
Yong, sorry, it’s been a while since I’ve looked at this code. I think model-a and -b do not track configuration changes (they contribute to the configuration, but don’t care if another bundle changes it). I noticed in the application’s bundle-context-osgi.xml this line is not commented out - as I remember it, the application is really the bundle that is interested in tracking configuration changes.
Had any luck getting transactions (e.g. using @Transactional annotations) to work?
Hi loedolff,
I red your article with great interest as I am currently starting a project on Equinox/Spring DM and wish to use JPA with hibernate.
I tried to download the code from SVN, but a username/password is required.
Could you provide me the credentials. Regards, christian.
Christian, the code is hosted at code.google.com, and it shouldn’t ask you for a password if you are using http. It will ask for a password if you use https. Please see http://code.google.com/p/voluble/source/checkout for more details.
hi loedolff,
I just gone through your post it looks very helpful, here I have Some doubts, first of all I want try out an example using JPA with hibernate.
My scenario is like this, My application built up with many bundles, and each bundle will be a module of my application, so when ever I deploy any bundle , that particular module should be added to the Application, and its corresponding DB table s should be get created in the Application DB. For this I approached like this, In each bundle’s Manifest folder I just kept the persistence.xml, and I am using Datasource as an OSGi service, I created an entity manager factory for each bundle in respective bundle (as it has to execute the persistence.xml), here is my problem like,Is it possible to use a singleentitymanger factory to execute the each bundles persistence.xml at the time of deployment of each bundle.
Mahesh Yamsani,
(I) Bundle Exporting EntityManagerFactory
I have used a singleentitymanager factory and have exported it using
(II) Bundles with Entities, importing EntityManagerFactory
(a) Imported EntityManagerFactory into other bundles.
(b) Also set the FragmentHost set to the bundle exporting EntityManagerFactory.
(c) Note the persistence.xml file need to have the managed class names.
Also have postProcessPersistenceUnitInfo() overridden in DefaultPersistenceUnitManager to update the managed classes from the old pui.
Please let me know if there is better way to set the managed clasess than specifying the persistence.xml.
loedolff your work on this has primarily guided by to reach this far.
Code went missing, hence ignore my previous comment.
Mahesh Yamsani,
(I) Bundle Exporting EntityManagerFactory
I have used a singleentitymanager factory and have exported it as an OSGI service
(II) Bundles with Entities, importing EntityManagerFactory
(a) Imported EntityManagerFactory into other bundles using osgi:reference element.
(b) Also set the FragmentHost set to the bundle exporting EntityManagerFactory. The PU bean is otherwise not visible to this bundle.
(c) Note the persistence.xml file need to have the managed class names. At the moment hibernate is not able to scan the enitties in the bundle.
(d) have postProcessPersistenceUnitInfo() overridden in DefaultPersistenceUnitManager to update the managed classes from the old pui. When more then one bundle exports persistence.xml the latest overrides the rest.
Please let me know if there is better way to set the managed clasess than specifying the persistence.xml.
loedolff your work on this has primarily guided by to reach this far.
Hi loedolff,
I’m using your example as base (hibernate_session, model_a projects) and created brand new projects very similar to that. And I also use BND plugin to generate jar files. I am using Spring DM server, I started the server, copied the hibernate_session equivalen project to pickup folder, once I see “Deployed … completed” message, then I deployed “model_a” equivalent project and I also same “Deployed … completed” message but I do not see the bundleChanged event fired. I also checked out ss and I could see that both bundles are in ACTIVE state. What might be the problem with this approach ? Could you please help me with this ?
Hi loedolff,
While going though the code I found that “com.notehive.osgi.hibernate_samples.session.DynamicSessionFactory” has been configured and instantiated as a bean “dynamicSessionFactory” (through bundle-context.xml files) in hibernate-session and model-a and model-b. Are we creatinging multiple instances of DynamicSessionFactory here?
If yes, could you please explain the use of it as I beleive that we need only one “dynamicSessionFactory” from hibernate-session bundle which will be consumed by other bundles and .
Thanks,
Amit
Amit,
I think you are right. The big problem was (as I remember it from almost 2 years ago), to share the same DynamicConfiguration among bundles (all DynamicSessionFactory instances refer to the same instance of DynamicConfiguration). Looking at it again now it seems that the code could just as well have referenced a single DynamicSessionFactory instance. At the moment I cannot see why that wouldn’t work.
-Hans
Hello loedolff,
Your work here is very interesting. I’m working on a project being developed over Eclipse PDE and we would like to get Hibernate (with this dynamic behavior) as an OSGi service. Is there a simple way to achieve this from your code?
Thanks!
Miguel,
I think it should be possible to use this example as a starting point. I’m afraid getting this dynamic behavior to work is ridiculously complex (not simple!), so if you build on top of this example I would make only very minor changes between running a full test suite and checking in the changes.
The version of Hibernate I used is a little dated now, and there may be other persistence frameworks that are better suited for OSGi type development.
Hello,
Thank you for your great tutorial, I am a newbie in OSGI and it helps a lot to understand how to structure a project with OSGI.
However, I am not sure to understand why you are re-packaging hibernate-classes, jta and hqldb. Does the normal way to do is to install jar directly in osgi shell? I have the feeling that you need to do that because hibernate jar are not correctly build to run directly in osgi, am I right?
Do you know if there is another way to do it?
Thanks in advance
At the time I did this project, those jars did not contain the metadata that turns a jar into an OSGI bundle (later versions of the same jars might now contain the OSGI metadata in the manifest file).
Hi, m2.codehaus.org is not working..
Downloading: http://m2.safehaus.org/org/springframework/osgi/aopalliance.osgi/1.0-SNAPSHOT/maven-metadata.xml
[WARNING] Could not transfer metadata org.springframework.osgi:aopalliance.osgi:1.0-SNAPSHOT/maven-metadata.xml from/to safehaus-repository (http://m2.safehaus.org): connection timed out
Downloading: http://m2.safehaus.org/org/springframework/osgi/osgi-repo/1.0-SNAPSHOT/maven-metadata.xml
[WARNING] Could not transfer metadata org.springframework.osgi:osgi-repo:1.0-SNAPSHOT/maven-metadata.xml from/to safehaus-repository (http://m2.safehaus.org): connection timed out
Downloading: http://m2.safehaus.org/org/springframework/osgi/junit.osgi/3.8.2-SNAPSHOT/maven-metadata.xml
[WARNING] Could not transfer metadata org.springframework.osgi:junit.osgi:3.8.2-SNAPSHOT/maven-metadata.xml from/to safehaus-repository (http://m2.safehaus.org): connection timed out
Downloading: http://m2.safehaus.org/org/springframework/osgi/log4j.osgi/1.2.15-SNAPSHOT/maven-metadata.xml
[WARNING] Could not transfer metadata org.springframework.osgi:log4j.osgi:1.2.15-SNAPSHOT/maven-metadata.xml from/to safehaus-repository (http://m2.safehaus.org): connection timed out
Downloading: http://m2.safehaus.org/org/osgi/org.osgi.core/4.0/org.osgi.core-4.0.pom
[INFO] ————————————————————————
[INFO] Reactor Summary:
[INFO]
[INFO] osgi 3rdparty ………………………………. SUCCESS [0.202s]
[INFO] osgi deployment …………………………….. SUCCESS [1.904s]
[INFO] Javax Transaction …………………………… SUCCESS [1.647s]
[INFO] Hibernate Classes …………………………… SUCCESS [7.742s]
[INFO] HSQLDB …………………………………….. SUCCESS [1.858s]
[INFO] Hibernate Session …………………………… FAILURE [3:30.035s]
[INFO] Model A ……………………………………. SKIPPED
[INFO] Model B ……………………………………. SKIPPED
[INFO] Application ………………………………… SKIPPED
[INFO] Integration Tests …………………………… SKIPPED
[INFO] osgi deployment …………………………….. SKIPPED
[INFO] ————————————————————————
[INFO] BUILD FAILURE
[INFO] ————————————————————————
Thanks.
Uh-oh. Thanks for pointing that out. I don’t know what changed. Perhaps my Maven project’s library dependencies versions were not specified strict enough, and now it’s picking up a different version of some upstream dependency than what I had originally tested it with.
I get the same failure as miseo. Apparently, m2.safehous.org is offline. I have been unable to reach it when trying this that last two days.
-> 89287 [FelixDispatchQueue] INFO [undefined] - BundleEvent STARTED
WARNING: META-INF/services/org.apache.commons.logging.LogFactory (org.apache.felix.moduleloader.ResourceNotFoundException: META-INF/services/org.apache.commons.logging.LogFactory)
WARNING: *** Class ‘org.apache.commons.dbcp.BasicDataSourceBeanInfo’ was not found because bundle 44 does not import ‘org.apache.commons.dbcp’ even though bundle 44 does export it. To resolve this issue, add an import for ‘org.apache.commons.dbcp’ to bundle 44. ***
WARNING: *** Package ‘org.apache.commons.dbcp’ is imported by bundle 45 from bundle 44, but the exported package from bundle 44 does not contain the requested class ‘org.apache.commons.dbcp.BasicDataSourceBeanInfo’. Please verify that the class name is correct in t
WARNING: *** Class ‘java.lang.ObjectBeanInfo’ was not found. Bundle 45 does not import package ‘java.lang’, nor is the package exported by any other bundle or available from the system class loader. *** (java.lang.ClassNotFoundException: *** Class ‘java.lang.Object
DataSource Service Exists
ERROR: Unable to get module class path. (java.lang.NullPointerException)
java.lang.NullPointerException
at java.util.jar.Manifest$FastInputStream.fill(Unknown Source)
at java.util.jar.Manifest$FastInputStream.readLine(Unknown Source)
at java.util.jar.Manifest$FastInputStream.readLine(Unknown Source)
at java.util.jar.Attributes.read(Unknown Source)
at java.util.jar.Manifest.read(Unknown Source)
at java.util.jar.Manifest.(Unknown Source)
at org.apache.felix.framework.searchpolicy.ContentLoaderImpl.calculateContentPath(ContentLoaderImpl.java:344)
at org.apache.felix.framework.searchpolicy.ContentLoaderImpl.initializeContentPath(ContentLoaderImpl.java:315)
at org.apache.felix.framework.searchpolicy.ContentLoaderImpl.getClassPath(ContentLoaderImpl.java:90)
at org.apache.felix.framework.searchpolicy.ContentClassLoader.findClass(ContentClassLoader.java:154)
at org.apache.felix.framework.searchpolicy.ContentClassLoader.loadClassFromModule(ContentClassLoader.java:94)
at org.apache.felix.framework.searchpolicy.ContentLoaderImpl.getClass(ContentLoaderImpl.java:166)
at org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClassOrResource(R4SearchPolicyCore.java:471)
at org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:185)
at org.apache.felix.framework.searchpolicy.R4SearchPolicy.findClass(R4SearchPolicy.java:45)
at org.apache.felix.moduleloader.ModuleImpl.getClass(ModuleImpl.java:216)
at org.apache.felix.framework.searchpolicy.R4Wire.getClass(R4Wire.java:116)
at org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.searchImports(R4SearchPolicyCore.java:505)
at org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClassOrResource(R4SearchPolicyCore.java:466)
at org.apache.felix.framework.searchpolicy.R4SearchPolicyCore.findClass(R4SearchPolicyCore.java:185)
at org.apache.felix.framework.searchpolicy.R4SearchPolicy.findClass(R4SearchPolicy.java:45)
at org.apache.felix.moduleloader.ModuleImpl.getClass(ModuleImpl.java:216)
at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1540)
at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:358)
at org.springframework.osgi.util.BundleDelegatingClassLoader.findClass(BundleDelegatingClassLoader.java:99)
at org.springframework.osgi.util.BundleDelegatingClassLoader.loadClass(BundleDelegatingClassLoader.java:156)
at java.lang.ClassLoader.loadClass(Unknown Source)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1138)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:882)
at com.causeway.dbpool.PoolActivator$Customizer.addingService(PoolActivator.java:66)
at org.osgi.util.tracker.ServiceTracker$Tracked.trackAdding(ServiceTracker.java:1030)
at org.osgi.util.tracker.ServiceTracker$Tracked.track(ServiceTracker.java:1008)
at org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:933)
at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:765)
at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:623)
at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:554)
at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3566)
at org.apache.felix.framework.Felix.access$200(Felix.java:37)
at org.apache.felix.framework.Felix$2.serviceChanged(Felix.java:833)
at org.apache.felix.framework.ServiceRegistry.fireServiceChanged(ServiceRegistry.java:559)
at org.apache.felix.framework.ServiceRegistry.registerService(ServiceRegistry.java:75)
at org.apache.felix.framework.Felix.registerService(Felix.java:2713)
at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:252)
at org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean.registerService(OsgiServiceFactoryBean.java:310)
at org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean.registerService(OsgiServiceFactoryBean.java:279)
at org.springframework.osgi.service.exporter.support.OsgiServiceFactoryBean$Executor.registerService(OsgiServiceFactoryBean.java:95)
at org.springframework.osgi.service.exporter.support.internal.controller.ExporterController.registerService(ExporterController.java:40)
at org.springframework.osgi.service.dependency.internal.DefaultMandatoryDependencyManager.startExporter(DefaultMandatoryDependencyManager.java:320)
at org.springframework.osgi.service.dependency.internal.DefaultMandatoryDependencyManager.checkIfExporterShouldStart(DefaultMandatoryDependencyManager.java:261)
at org.springframework.osgi.service.dependency.internal.DefaultMandatoryDependencyManager.discoverDependentImporterFor(DefaultMandatoryDependencyManager.java:254)
at org.springframework.osgi.service.dependency.internal.DefaultMandatoryDependencyManager.addServiceExporter(DefaultMandatoryDependencyManager.java:187)
at org.springframework.osgi.service.dependency.internal.MandatoryDependencyBeanPostProcessor.postProcessAfterInitialization(MandatoryDependencyBeanPostProcessor.java:46)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:361)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1344)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
at java.security.AccessController.doPrivileged(Native Method)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:423)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutionApplicationContext.java:69)
at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355)
at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320)
at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132)
at java.lang.Thread.run(Unknown Source)
Causeway DataBase Pool Initialisation Failed
89440 [SpringOsgiExtenderThread-7] INFO - ServiceEvent REGISTERED
89443 [SpringOsgiExtenderThread-7] INFO - ServiceEvent REGISTERED
i am getting this error