Camel-SQL route 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>

The Datasource is installed as a seperate service following the instructions as described in this post: How can I install postgresqljdbc to work in Karaf OSGi?

Это нормально работает! Я могу отправить JSON на URL-адрес Jetty, и он будет вставлен в базу данных. Но когда я пытаюсь получить данные с этой конечной точки, я получаю следующую ошибку

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.

Странно то, что когда я заменяю <to uri="sql:SELECT * FROM public.&quot;UserData&quot; WHERE id = **:#id**"/> на <to uri="sql:SELECT * FROM public.&quot;UserData&quot; WHERE id = **2**"/>, он снова работает нормально, и я получаю небольшой симпатичный JSON пользователя №2.

Любые намеки на то, как это решить?

Проблема была не в моем маршруте или верблюде. Это было вызвано PostgreSQL. Используя параметр в моем маршруте, мне нужно было предоставить явное приведение типов.


person Sander Kouwenhoven    schedule 23.09.2016    source источник
comment
Спасибо, да. Я использовал ‹choice› с ‹simple›, чтобы проверить, установлен ли заголовок, и я вижу, что он установлен правильно.   -  person Alexey Yakunin    schedule 24.09.2016
comment
Попробуйте добавить такие параметры _1_: _2_ и удалить bean id = sql из вашего конуса   -  person Sander Kouwenhoven    schedule 26.09.2016
comment
Все еще такое же сообщение :( Мой маршрут теперь выглядит так: dataSource=dataSource&allowNamedParameters=true   -  person Alexey Yakunin    schedule 26.09.2016
comment
Странно, это действительно кажется ошибкой при запросе с использованием столбца id .. Когда я изменяю свой маршрут на <route id="connect.userdata_get2"> <from uri="jetty:http://localhost:8881/userdata2?httpMethodRestrict=GET"/> <log message="$simple{in.header.id}" /> <to uri="sql:SELECT lastname FROM public.&quot;UserData&quot; WHERE id = :#id?dataSource=dataSource&amp;allowNamedParameters=true"/> </route> и помещаю существующее имя в параметр GET моего запроса, он просто отлично работает.   -  person Sander Kouwenhoven    schedule 26.09.2016
comment
Можно использовать псевдоним таблицы или изменить имя параметра, что может помочь (вы можете использовать id, но установить другой заголовок позже. Идентификатор, например, и использовать идентификатор в запросе).   -  person Sander Kouwenhoven    schedule 26.09.2016
comment
(SQLErrorCodeSQLExceptionTranslator.java:103) по адресу org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator (JdbcAccessor.java:99) по адресу org.springframework.jdbc.core.JdbcTemplate.jdbcTemplate.jdbc5: camel.component.sql.SqlProducer.process (SqlProducer.java:100) по адресу org.apache.camel.util.AsyncProcessorConverterHelper $ ProcessorToAsyncProcessorBridge.process (AsyncProcessorConverterHelper.java:61.cprocessorConverterHelper.java:61. SendProcessor.java:145) в org.apache.camel.management.InstrumentationProcessor.process (InstrumentationProcessor.java:77) в org.apache.camel.processor.RedeliveryErrorHandler.process (RedeliveryErrorHandler.java:460) в org. .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.CamelI nternalProcessor.process (CamelInternalProcessor.java:190) по адресу org.apache.camel.component.jetty.CamelContinuationServlet.service (CamelContinuationServlet.java:191) по адресу javax.servlet.http.HttpServlet.service7:java или HttpServlet. .eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:812) в org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1669) в org.eclipse.jetty.servlets. (MultiPartFilter.java:146) в org.apache.camel.component.jetty.CamelFilterWrapper.doFilter (CamelFilterWrapper.java:43) в org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter: в ServletHandler. org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:585) на org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1127) на org.eclipse.jetty.servlet.Servlet. doScope (ServletHandler.java:515) в org.eclipse.jetty.server.handler.ContextHandler.doScope (C ontextHandler.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.onFillable .java: 257) на org.eclipse.jetty.io.AbstractConnection $ 2.run (AbstractConnection.java:544) на org.eclipse.jetty.util.thread. QueuedThreadPool.runJob (QueuedThreadPool.java:635) на org.eclipse.jetty.util.thread.QueuedThreadPool $ 3.run (QueuedThreadPool.java:555) на java.lang.Thread.run (Thread.java:745)   -  person Alexey Yakunin    schedule 26.09.2016


Ответы (1)


Чтобы это заработало, мне нужно было добавить :: bigint к параметру в моем маршруте: sql:SELECT lastname FROM public.&quot;UserData&quot; WHERE id = :#id::bigint?dataSource=dataSource&amp;allowNamedParameters=true

По какой-то причине ошибка Postgres была проглочена Camel-sql, и я получил странное сообщение об уничтожении источника данных.

Спасибо всем за полезные комментарии и вопросы!

Вы должны просмотреть свой обмен перед запросом sql и убедиться, что сообщение о доходе содержит идентификатор заголовка.

person Sander Kouwenhoven    schedule 26.09.2016