[
https://issues.apache.org/jira/browse/CAMEL-17107?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-17107.
---------------------------------
Resolution: Not A Bug
The standard in Camel has always been # notation.
Its just that the old sql component was built many years ago and had
unfortunately special code when there was no #.
On top of that Camel now supports autowiring options if they have been marked
with that. See the doc where it says Autowired in bold in the description.
In case of upgrade guides, then you are surely welcome to send a PR to update
the guide.
> 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)