#java #jpa #spring-integration
#java #jpa #spring-интеграция
Вопрос:
Я пытаюсь опрашивать базу данных каждые 5 секунд и хочу получать любые записи, созданные / обновленные за последние 5 секунд.
Вот блок кода
@Bean
public JpaExecutor jpaExecutor() {
JpaExecutor executor = new JpaExecutor(this.entityManagerFactory);
executor.setJpaQuery("from Product p where p.updateDttm >= :updateDttm");
executor.setJpaParameters(Collections.singletonList(new JpaParameter("updateDttm", "2019-02-28 12:02:15.000", null)));
return executor;
}
Вот ошибка, которую я получаю
ERROR 908 --- [ask-scheduler-8] o.s.integration.handler.LoggingHandler : org.springframework.messaging.MessagingException: nested exception is java.lang.IllegalArgumentException: Query has parameters but no parameter source provided
at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:343)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$null$1(AbstractPollingEndpoint.java:277)
at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute$0(ErrorHandlingTaskExecutor.java:57)
at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$createPoller$2(AbstractPollingEndpoint.java:274)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: Query has parameters but no parameter source provided
at org.springframework.integration.jpa.core.DefaultJpaOperations.setParametersIfRequired(DefaultJpaOperations.java:348)
at org.springframework.integration.jpa.core.DefaultJpaOperations.getQuery(DefaultJpaOperations.java:117)
at org.springframework.integration.jpa.core.DefaultJpaOperations.getResultListForQuery(DefaultJpaOperations.java:190)
at org.springframework.integration.jpa.core.JpaExecutor.doPoll(JpaExecutor.java:569)
at org.springframework.integration.jpa.core.JpaExecutor.poll(JpaExecutor.java:505)
at org.springframework.integration.jpa.core.JpaExecutor.poll(JpaExecutor.java:476)
at org.springframework.integration.jpa.inbound.JpaPollingChannelAdapter.doReceive(JpaPollingChannelAdapter.java:82)
at org.springframework.integration.endpoint.AbstractMessageSource.receive(AbstractMessageSource.java:160)
at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:250)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:360)
at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:329)
Комментарии:
1. смогли ли вы найти решение?
Ответ №1:
Ваше выполнение заканчивается с этой логикой:
if (requestMessage == null) {
result = doPoll(this.parameterSource, 0, maxNumberOfResults);
}
похоже, что вы не this.parameterSource
настроили.
Его можно настроить через:
/**
* Specify the {@link ParameterSource} that would be used to provide
* additional parameters.
* @param parameterSource Must not be null.
*/
public void setParameterSource(ParameterSource parameterSource) {
Однако вам нужно будет отказаться от этого, executor.setJpaParameters
если в пользу установщика на BeanPropertyParameterSourceFactory.setStaticParameters()
. createParameterSource(null)
Может быть использован для выполнения этого setParameterSource()
на
JpaExecutor
.
Я думаю, мы можем рассмотреть некоторые улучшения в этом вопросе, чтобы создать ParameterSource
внутренне для опроса, как мы делаем для parameterSourceFactory
в случае исходящих операций.
Не стесняйтесь поднимать проблему GH по этому вопросу.