当使用报头值作为参数时,Camel-SQL路由ServiceUnavailableException



在ApacheServiceMix 7.0.0中,我使用Blueprint定义了以下路由:

 <reference id="dataSource" interface="javax.sql.DataSource" filter="(dataSourceName=connectuserdata)" />
<bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
    <property name="dataSource" ref="dataSource" />
</bean>
<camelContext xmlns="http://camel.apache.org/schema/blueprint">
    <package>com.focuscura</package>
    <dataFormats>
        <!-- here we define a Json data format with the id jack and that it should use the TestPojo as the class type when
             doing unmarshal. The unmarshalTypeName is optional, if not provided Camel will use a Map as the type -->
        <json id="userdata" library="Jackson" />
    </dataFormats>
    <route id="connect.userdata_create">
        <from uri="jetty:http://localhost:8881/userdata?httpMethodRestrict=POST"/>
        <unmarshal ref="userdata"/>
        <!--<process ref="scalaUserDataProcessor"/>-->
        <log message="Received new userdata" />
        <to uri="sql:INSERT INTO public.&quot;UserData&quot; (lastname, firstname) VALUES (:#lastname , :#firstname)"/>
    </route>
    <route id="connect.userdata_get2">
        <from uri="jetty:http://localhost:8881/userdata2?httpMethodRestrict=GET"/>
        <to uri="sql:SELECT * FROM public.&quot;UserData&quot; WHERE id = :#id"/>
        <!--<process ref="scalaUserDataProcessor"/>-->
        <marshal ref="userdata"/>
    </route>
</camelContext>

Datasource是作为一个独立的服务按照这篇文章中描述的说明安装的:我如何安装postgresqljdbc来工作在Karaf OSGi?

这个工作很好!我可以张贴JSON到Jetty URL,它被插入到数据库中。但是当我试图从这个端点获取数据时,我得到以下错误

org.osgi.service.blueprint.container.ServiceUnavailableException: The Blueprint container is being or has been destroyed: (&(dataSourceName=connectuserdata)(objectClass=javax.sql.DataSource))
at org.apache.aries.blueprint.container.ReferenceRecipe.getService(ReferenceRecipe.java:241)
at org.apache.aries.blueprint.container.ReferenceRecipe.access$000(ReferenceRecipe.java:56)
at org.apache.aries.blueprint.container.ReferenceRecipe$ServiceDispatcher.call(ReferenceRecipe.java:306)
at Proxyb6abdd30_6f59_4e89_a419_c4ff0558aa62.equals(Unknown Source)
at java.util.WeakHashMap.eq(WeakHashMap.java:287)
at java.util.WeakHashMap.get(WeakHashMap.java:401)
at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:204)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:140)
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.

(SQLErrorCodeSQLExceptionTranslator.java: 103)org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator (JdbcAccessor.java: 99)org.springframework.jdbc.core.JdbcTemplate.execute (JdbcTemplate.java: 605)org.apache.camel.component.sql.SqlProducer.process (SqlProducer.java: 100)org.apache.camel.util.AsyncProcessorConverterHelper ProcessorToAsyncProcessorBridge.process美元(AsyncProcessorConverterHelper.java: 61)org.apache.camel.processor.SendProcessor.process (SendProcessor.java: 145)org.apache.camel.management.InstrumentationProcessor.process (InstrumentationProcessor.java: 77)org.apache.camel.processor.RedeliveryErrorHandler.process (RedeliveryErrorHandler.java: 460)org.apache.camel.processor.CamelInternalProcessor.process (CamelInternalProcessor.java: 190)org.apache.camel.processor.Pipeline.process (Pipeline.java: 121)org.apache.camel.processor.Pipeline.process (Pipeline.java: 83)org.apache.camel.processor.CamelInternalProcessor.process (CamelInternalProcessor.java: 190)org.apache.camel.component.jetty.CamelContinuationServlet.service (CamelContinuationServlet.java: 191)javax.servlet.http.HttpServlet.service (HttpServlet.java: 790)org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java: 812)org.eclipse.jetty.servlet.ServletHandler CachedChain.doFilter美元(ServletHandler.java: 1669)org.eclipse.jetty.servlets.MultiPartFilter.doFilter (MultiPartFilter.java: 146)org.apache.camel.component.jetty.CamelFilterWrapper.doFilter (CamelFilterWrapper.java: 43)org.eclipse.jetty.servlet.ServletHandler CachedChain.doFilter美元(ServletHandler.java: 1652)org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java: 585)org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java: 1127)org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java: 515)org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java: 1061)org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java: 141)org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java: 97)org.eclipse.jetty.server.Server.handle (Server.java: 499)org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java: 311)org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java: 257)在org.eclipse.jetty.io.AbstractConnection 2.美元运行(AbstractConnection.java: 544)org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java: 635)在org.eclipse.jetty.util.thread.QueuedThreadPool 3.美元运行(QueuedThreadPool.java: 555)java.lang.Thread.run (Thread.java: 745)

奇怪的是,当我用<to uri="sql:SELECT * FROM public.&quot;UserData&quot; WHERE id = **2**"/>代替<to uri="sql:SELECT * FROM public.&quot;UserData&quot; WHERE id = **:#id**"/>时它再次工作正常,我得到一个漂亮的JSON用户nr 2返回。

关于如何解决这个问题有什么提示吗?

问题不在于我的路线或骆驼。这是由PostgreSQL引起的。通过在路由中使用参数,我需要提供显式类型转换。

为了得到这个工作,我需要添加::bigint到我的路由参数:sql:SELECT lastname FROM public.&quot;UserData&quot; WHERE id = :#id::bigint?dataSource=dataSource&amp;allowNamedParameters=true

由于某些原因,来自Postgres的错误被Camel-sql吞噬,我得到了关于数据源被销毁的奇怪消息。

感谢大家的宝贵意见和问题!

最新更新