Компонент Sql: использовать несколько строк и пометить их все как обработанные с помощью onConsume

Я настроил компонент sql верблюда для чтения данных из таблицы базы данных. У меня есть параметр onConsume, который работает, когда я читаю одну строку за раз, но не работает, когда я пытаюсь прочитать несколько строк за раз с помощью maxMessagesPerPoll. Вот что я пробовал ...

Работает: когда я читаю по одной строке и обновляю строку с помощью onConsume.

Мой URI конечной точки потребителя выглядит так:

sql:select * from REPORT where IS_VIOLATED != 'N' and TYPE = 'Provisioning'?consumer.delay=1000&consumer.onConsume=update REPORT set IS_VIOLATED = 'N' where REPORT_ID =:#REPORT_ID

Не работает: когда я настроил компонент sql верблюда для чтения настраиваемых строк (с помощью maxMessagesPerPoll). Он читает несколько строк за раз, но onConsume, похоже, не работает. Я попытался сказать верблюду использовать оператор IN и установить значение заголовка (REPORT_ID) с массивом значений для предложения IN.

URI моей конечной точки потребителя теперь выглядит так:

sql:select * from REPORT where IS_VIOLATED != 'N' and TYPE = 'Provisioning'?consumer.delay=1000&maxMessagesPerPoll=3&consumer.useIterator=false&consumer.onConsume=update REPORT set IS_VIOLATED = 'N' where REPORT_ID in(:#REPORT_ID)

Возможно, я здесь что-то делаю не так. Я уже достаточно поискал по этому поводу и нашел связанный post1, post2. Но это не наставляет меня на правильный путь.

Мне нужно иметь возможность пометить все использованные строки как IS_VIOLATED = 'N'.

Спасибо за вашу помощь.


person rohith    schedule 14.08.2018    source источник


Ответы (2)


Я заметил, что вы установили consumer.useIterator=false, а в документе говорится:

Если true, каждая строка, возвращаемая при опросе, будет обрабатываться индивидуально. Если false, весь java.util.List данных устанавливается как тело IN.

Поэтому я думаю, что из-за этой опции :#REPORT_ID больше не понимается, так как он будет из всего списка, а не из каждой строки.

Может быть, уже достаточно было бы убрать эту опцию.

Я также не понял, почему вы изменили предложение where с where REPORT_ID =:#REPORT_ID на where REPORT_ID in(:#REPORT_ID).

person Rafael    schedule 26.11.2018

Внимательно изучив документ по компоненту apache sql:

Я пробовал реализовать специальную стратегию обработки, используя атрибут processingStrategy `.

public class ReportProcessingStratergy implements SqlProcessingStrategy {
@Override
public int commit(DefaultSqlEndpoint defaultSqlEndpoint, Exchange exchange, Object o, JdbcTemplate jdbcTemplate, String s) throws Exception {
    s = s.replace("?","5066834,5066835,5066832");
    return jdbcTemplate.update(s);
}

@Override
public int commitBatchComplete(DefaultSqlEndpoint defaultSqlEndpoint, JdbcTemplate jdbcTemplate, String s) throws Exception {
    return 0;
}

}

настроить Spring bean:

  <bean class="go.ga.ns.reconc.sl.ReportProcessingStratergy" id="reportProcessingStratergy">

теперь мой uri конечной точки потребителя sql выглядит так:

sql:select * from REPORT where IS_VIOLATED != 'N' and TYPE = 'Provisioning'?consumer.delay=1000&maxMessagesPerPoll=3&consumer.useIterator=false&&processingStrategy=#reportProcessingStratergy&consumer.onConsume=update REPORT set IS_VIOLATED = 'N' where REPORT_ID in(?)

примечание: processingStrategy = # reportProcessingStratergy (# имеет значение, как описано в здесь, без него не вышло)

person rohith    schedule 14.08.2018