[
https://issues.apache.org/jira/browse/CAMEL-17107?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17432497#comment-17432497
]
Claus Ibsen commented on CAMEL-17107:
-------------------------------------
You need to use `#bean:` syntax, eg dataSource=#bean:myDataSource
You can also use #myDataSource as shothand, but #bean: tells Camel you want to
inject a bean with that id.
> 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
> Priority: Minor
>
> 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)