Как использовать хранимую процедуру с пакетной обработкой Mule 3.5

#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>