Hi, I've been trying to get a route to work with the Camel Quickfix implementation and could use some help. All I'm trying to do is create a route that accepts messages from QuickfixJ and stores them in a SQL Server database via the camel sql component and the MS JDBC driver. So I created the following just to see if I could insert a static record into the database:
<route> <from uri="timer:foo?period=60s"/> <filter> <simple>${header.MessageType} in 6,7</simple> <to uri="sqlOMM:insert into OMM.dbo.IOIs (id, IDSource, IOIid, Symbol, IOIShares, SecurityDesc, Price, IOINatural) VALUES (1, 'BILLSOURCE', '0001', 'HOG', 12345, 'Harley Davidson', 32.00, 'Y')"/> </filter> </route> <bean id="ommdb" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/> <property name="url" value="jdbc:sqlserver://localhost:1433;integratedSecurity=true;databaseName=OMM"/> </bean> <bean id="sqlOMM" class="org.apache.camel.component.sql.SqlComponent"> <property name="dataSource" ref="ommdb"/> </bean> This works fine, i.e., a new record is inserted into the database every 60 seconds. But then I replace the timer URI with a Quickfix URI like this: <from uri="quickfix:config.cfg"/> I know the Quickfix config is working ok as I use it elsewhere. But upon receipt of a valid FIX message this generates the log message: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into OMM.dbo.IOIs (id, IDSource, IOIid, Symbol, IOIShares, SecurityDesc, Price, IOINatural) VALUES (2, 'BILLSOURCE', '0001', 'HOG', 12345, 'Harley Davidson', 32.00, 'Y')]; The index 1 is out of range.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range. at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:106) at ( REMAINING STACK TRACE BELOW) It's strange because I'm not even trying to access the Quickfix message (but it's probably being accessed by the sql bean anyway). After a lot of Googleing and reading I think this may be caused be an incompatibility between the Quickfix Exchange Message and the SQL component. Here's how I'm thinking about it. The Camel QuickfixJ component generates a quickfix.Message which is a FieldMap which derived from TreeMap. According to the Camel sql component documentation, it should accept a Map as input and allow specification of fields in the insert statement. Is this right? Or do I need to write some kind of converter? If the Quickfix message is being sent as a Map, shouldnt I be able to use a log statement like, <log message="About to perform SQL INSERT on ${body[107]}"/> this doesnt work either. I get an error saying that the key 107 is not valid. Finally, in desperation I tried inserting a converter statement: <convertBodyTo type="quickfix.Message"/> but no change in behavior. Can someone help with a little explanation? Thanks, Bill org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into OMM.dbo.IOIs (id, IDSource, IOIid, Symbol, IOIShares, SecurityDesc, Price, IOINatural) VALUES (2, 'BILLSOURCE', '0001', 'HOG', 12345, 'Harley Davidson', 32.00, 'Y')]; The index 1 is out of range.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range. at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:106) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:607) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:619) at org.apache.camel.component.sql.SqlProducer.process(SqlProducer.java:49) at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:115) at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:285) at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:110) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223) at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.Pipeline.process(Pipeline.java:117) at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.FilterProcessor.process(FilterProcessor.java:58) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:333) at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:223) at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150) at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:576) at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:509) at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:220) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:163) at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:304) at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:45) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.processor.UnitOfWorkProcessor.processAsync(UnitOfWorkProcessor.java:150) at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:117) at org.apache.camel.processor.RouteInflightRepositoryProcessor.processNext(RouteInflightRepositoryProcessor.java:50) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73) at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90) at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:71) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:99) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:86) at org.apache.camel.component.quickfixj.QuickfixjConsumer.onExchange(QuickfixjConsumer.java:38) at org.apache.camel.component.quickfixj.QuickfixjEndpoint.onEvent(QuickfixjEndpoint.java:94) at org.apache.camel.component.quickfixj.QuickfixjEngine$Dispatcher.dispatch(QuickfixjEngine.java:448) at org.apache.camel.component.quickfixj.QuickfixjEngine$Dispatcher.fromApp(QuickfixjEngine.java:385) at quickfix.Session.fromCallback(Session.java:1698) at quickfix.Session.verify(Session.java:1650) at quickfix.Session.verify(Session.java:1727) at quickfix.Session.next(Session.java:987) at quickfix.mina.SingleThreadedEventHandlingStrategy$SessionMessageEvent.processMessage(SingleThreadedEventHandlingStrategy.java:114) at quickfix.mina.SingleThreadedEventHandlingStrategy.block(SingleThreadedEventHandlingStrategy.java:77) at quickfix.mina.SingleThreadedEventHandlingStrategy$1.run(SingleThreadedEventHandlingStrategy.java:94) at java.lang.Thread.run(Unknown Source) Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:714) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObjectNoType(SQLServerPreparedStatement.java:910) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setObject(SQLServerPreparedStatement.java:935) at org.apache.camel.component.sql.SqlProducer$1.doInPreparedStatement(SqlProducer.java:55) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:591) ... 83 more -- View this message in context: http://camel.465427.n5.nabble.com/QuickfixJ-Message-Map-tp5738238.html Sent from the Camel - Users mailing list archive at Nabble.com.