#stored-procedures #sql-server-2008-r2 #hashmap #mule #batch-processing
#хранимые процедуры #sql-server-2008-r2 #hashmap #mule #пакетная обработка
Вопрос:
Я использую соединитель Mule 3.5 Anypoint и перешел от запроса выбора к хранимым процедурам в компоненте области пакетной обработки. С этим изменением mule не нравится тип объекта, который возвращает хранимая процедура.
Вот ошибка, которую я получаю обратно:
ERROR 2014-06-26 15:15:00,426 [pool-15-thread-1] org.mule.exception.DefaultMessagingExceptionStrategy:
********************************************************************************
Message : Object "java.util.HashMap" not of correct type. It must be of type "{interface java.lang.Iterable,interface java.util.Iterator,interface org.mule.routing.MessageSequence,interface java.util.Collection}" (java.lang.IllegalArgumentException)
Code : MULE_ERROR--2
--------------------------------------------------------------------------------
Тип объекта, возвращаемого из соединителя базы данных с использованием хранимой процедуры, как таковой:
java.util.HashMap
С Select
помощью инструкции (это работает) тип как таковой:
org.mule.util.CaseInsensitiveHashMap
Как указано выше с инструкцией select, это работает.
Некоторые дополнительные сведения о системе:
- Это SQL Server 2008 R2
- Соединитель базы данных отлично работает с хранимой процедурой, но выдает ошибки при достижении раздела записей процесса
<batch:job name="ons-esb-mainBatch1"> <batch:threading-profile poolExhaustedAction="WAIT"/> <batch:input> <poll doc:name="Poll"> <fixed-frequency-scheduler frequency="15" timeUnit="SECONDS"/> <db:stored-procedure config-ref="Generic_Database_Configuration" doc:name="Database"> <db:parameterized-query><![CDATA[{ CALL otis.GetEntityQueueByTime() }]]></db:parameterized-query> </db:stored-procedure> </poll> <logger level="INFO" doc:name="Logger"/> </batch:input> <batch:process-records> <batch:step name="Batch_Step"> <choice doc:name="Choice"> <!-- Choice Selector Logic -- Taken Out to Save Space --!> </choice> </batch:step> </batch:process-records> <batch:on-complete> <logger message="EntityQueues Completed Queueing into ActiveMQ" level="INFO" doc:name="Logger"/> </batch:on-complete>
Краткие сведения
Я хотел бы найти способ, при котором обработка объекта с помощью пакетного процесса будет работать так, как будет работать оператор select.
Ответ №1:
A java.util.HashMap
не является итеративным. Попробуйте заменить полезную нагрузку сообщения на его entrySet()
:
<batch:input>
<poll doc:name="Poll">
<fixed-frequency-scheduler frequency="15" timeUnit="SECONDS"/>
<db:stored-procedure config-ref="Generic_Database_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[{ CALL otis.GetEntityQueueByTime() }]]></db:parameterized-query>
</db:stored-procedure>
</poll>
<set-payload value="#[message.payload.entrySet()]" />
<logger level="INFO" doc:name="Logger"/>
</batch:input>