Peter Hermsdorf created CAMEL-17107:
---------------------------------------

             Summary: camel-servlet - Osgi DataSource not found after update
                 Key: CAMEL-17107
                 URL: https://issues.apache.org/jira/browse/CAMEL-17107
             Project: Camel
          Issue Type: Bug
          Components: osgi, rest
    Affects Versions: 3.11.3
            Reporter: Peter Hermsdorf


Maybe related to CAMEL-17015

as mentioned 
here:[https://camel.zulipchat.com/#narrow/stream/257300-camel-karaf/topic/Problem.20with.20REST.20services.20after.20upgrading.20to.20Camel.203.2E11.2E2/near/256197689]

After Update the DataSource is not found by the routes.

We initialize our runtime like this:
{code:java}
camelContext = new OsgiDefaultCamelContext(bundleContext) {
                                @Override
                                public void init() {
                                        final RouteBuilder routes = 
createRoutes();
                                        
routes.restConfiguration().componentProperty("servletName", 
"my.custom.servletName").clientRequestValidation(true);
                                        this.addRoutes(routes);
                                        super.init();
                                }
{code}
Our routes look like
{code:java}
...
.toF("sql-stored:pwp.receive_sync(OUT VARCHAR result, BINARY 
${in.body})?function=true&dataSource=%s",   "DataSourceName")
{code}
We register the DataSource as OSGI Service like this:
{code:java}
inal Dictionary<String, String> properties = new Hashtable<>();// NOSONAR
properties.put(Constants.SERVICE_PID, "DataSourceName");
registerService(javax.sql.DataSource.class, ds, properties);
{code}
After upgrading from 3.4.4 to 3.11.3 the Datasource isn't found anymore

I compared the calls to SqlComponent.setDataSource and getDatasource and the 
lookup of the DataSource via OsgiBeanRepository.lookupByName(String):

in 3.4.4 setDataSource and getDatasource are not called and the 
OsgiBeanRepository.lookupByName is called 2 or three times (always returning 
the service)

in 3.11.3 SqlComponent.getDataSource is called at first and multiple times 
always returning null because no one calls setDatasource. 
OsgiBeanRepository.lookupByName is called once also returning the registered 
service.

Route creation fails with errors like:
{code:java}
2021-10-19 16:41:04,760 ERROR [BlueprintContainerImpl] Unable to start 
container for blueprint bundle com.godyo.p5.servicemix.camel/5.0.2145.qualifier
 org.osgi.service.blueprint.container.ComponentDefinitionException: Error when 
instantiating bean test_artnr of class org.apache.camel.Endpoint
 at 
org.apache.aries.blueprint.container.BeanRecipe.wrapAsCompDefEx(BeanRecipe.java:362)
 at 
org.apache.aries.blueprint.container.BeanRecipe.getInstanceFromFactory(BeanRecipe.java:298)
 at 
org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:279)
 at 
org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:685)
 at 
org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:666)
 at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:81)
 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
 at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:90)
 at 
org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:360)
 at 
org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:190)
 at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:737)
 at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:433)
 at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:298)
 at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
 at 
org.apache.aries.blueprint.container.ExecutorServiceWrapper.run(ExecutorServiceWrapper.java:106)
 at 
org.apache.aries.blueprint.utils.threading.impl.DiscardableRunnable.run(DiscardableRunnable.java:45)
 at 
java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
 at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
 at 
java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
 at 
java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
 at 
java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
 at java.base/java.lang.Thread.run(Thread.java:834)
 Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve 
endpoint: 
sql://SELECT%20ARTNR%20FROM%20ARSTAMM%20WHERE%20ARTNR=rpad(':%23$%7Bheader.artnr%7D',18)?dataSource=P4-DataSource&outputHeader=foundArtnr
 due to: DataSource must be configured
 at 
org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:962)
 at 
org.apache.camel.impl.engine.AbstractCamelContext.getEndpoint(AbstractCamelContext.java:844)
 at 
org.apache.camel.core.xml.AbstractCamelEndpointFactoryBean.getObject(AbstractCamelEndpointFactoryBean.java:54)
 at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 
Method)
 at 
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at 
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.base/java.lang.reflect.Method.invoke(Method.java:566)
 at 
org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:337)
 at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:835)
 at 
org.apache.aries.blueprint.container.BeanRecipe.getInstanceFromFactory(BeanRecipe.java:296)
 ... 21 common frames omitted
 Caused by: java.lang.IllegalArgumentException: DataSource must be configured
 at 
org.apache.camel.component.sql.SqlComponent.createEndpoint(SqlComponent.java:105)
 at 
org.apache.camel.support.DefaultComponent.createEndpoint(DefaultComponent.java:171)
 at 
org.apache.camel.impl.engine.AbstractCamelContext.doGetEndpoint(AbstractCamelContext.java:928)
 ... 30 common frames omitted
{code:java}
 {code}
Any help is more than welcome.

Thanks,  Peter

Bonus Question:
 why is that "workaround"(overriding init() method) for the 
OsgiDefaultCamelContext necessary? (otherwise the routes are not picked up)
 What would be "the right way"(tm) to do the initialization?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to