2015-07-25 4 views
2

Я хочу отправить список из клиента отдыха для отдыха веб-сервиса, который запустит работу в Spring Batch. Возможно ли это, или я должен сохранить список в файле базы данных/flatfile перед запуском задания и прочитать входные значения из базы данных/файла flatfile? Я думаю, кто-то указал, как это происходит в определенной проблеме Джиры (см. Ниже), но я не мог понять, по крайней мере, основную идею о том, как двигаться вперед. Я поставил под своим контроллером и как я пытаюсь передать его в JobParameter. Я поместил ссылку Джиры и возможное направление, возможно, я должен был взять, но я действительно не понял предложения в этом вопросе Джиры. Я добавил ниже клиента SoapUi, и, наконец, я вставил внизу весь мой журнал ошибок.ArrayList не может быть отнесен к org.springframework.batch.core.JobParameter

Мой контроллер:

@RequestMapping(value = "runit/family", method = RequestMethod.POST) 
     public void handle(@RequestBody List<Person> myFamily) throws Exception { 
       System.out.println(myFamily); //until here, it is fine 

       JobParameters jobParameters = new JobParametersBuilder() 
          .addParameter("parametersReceived", (JobParameter) myFamily) 
          .addLong("time", System.currentTimeMillis()).toJobParameters(); 

       jobLauncher.run(job, jobParameters); 
     } 

SoapUI (пост):

[{"firstName":"aa","lastName":"bb"}] 

Pojo

public class Person { 

    private String lastName; 
    private String firstName; 
    ...getters and setters 

Возможный способ работы, но я действительно путают об этой проблеме Jira. Честно говоря, я ожидал какой-то способ более простой, как я пытаюсь с JobParameter

https://jira.spring.io/browse/BATCH-966 (this suggestion is from 2009. Probably some more up-to-date technique is available) 
<bean class="MyItemReader"> 
<property name="dynamicValuesHashMap" ref="map"/> 
... 
</bean> 

<bean class="MyLauncher"> 
<property name="dynamicValuesHashMap" ref="map"/> 
... 
</bean> 

Вся ошибка:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.springframework.batch.core.JobParameter 

     at hello.BatchController.handle(BatchController.java:42) 

     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 

     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

     at java.lang.reflect.Method.invoke(Method.java:497) 

     at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 

     at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 

     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 

     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 

     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 

     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 

     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 

     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 

     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 

     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) 

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 

     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 

     at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

     at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 

     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 

     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 

     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 

     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 

     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 

     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 

     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 

     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 

     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 

     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 

     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 

     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) 

     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) 

     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 

     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 

     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 

     at java.lang.Thread.run(Thread.java:745) 
+0

Это одноразовый сценарий? Вам нужно запускать работу только один раз? Параметр, который вы передаете, то есть список лиц, фиксирован. Что должно произойти, если запланированное задание нужно запустить снова? Мне кажется, что это не пакетная работа. – Utkarsh

+1

Вы можете запустить задание из веб-службы или контроллера. Но я думаю, вам нужно получить список людей из базы данных во время выполнения задания в вашем классе Job. – Utkarsh

+0

Существует определенное приложение A. Пользователь будет генерировать отчет в этом приложении A. Этот отчет является входом для пакета, который является частью домена приложения B. У пользователя будет два способа отправить этот отчет из приложения A в приложение B: (1) просто нажмите кнопку SEND, поэтому я хочу получить этот вход через службу отдыха и начать работу.(2) Отредактируйте электронную таблицу и сохраните ее в некоторой папке, которую приложение B будет читать каждые 5 минут, чтобы начать работу. Я не могу думать, что это не пакетная работа. –

ответ

0

работы Пакетные предназначены для времени на основе не событие на основе. Таким образом, вы не можете передавать информацию из службы Rest в свой экземпляр Job. Прежде чем запускать задание в методе контроллера, напишите список во временном плоском файле или сохраните его в базе данных, откуда ваше объявление может прочитать его.

1

Если посмотреть на фактическом schema which stores meta data для spring batch вы увидите список доступных типов поддерживаемых задания быть параметрами (есть string_val, date_val, long_val, double_val). Поэтому при запуске задания каждый параметр задания сохраняется в БД с key_name как имя параметра и значения, хранящегося в одной из указанных таблиц _val. type_cd дает подсказку, какой тип был использован.

Также документация JobParameter дает подсказку, что может быть использовано в качестве параметра работы:

Domain representation of a parameter to a batch job. Only the following types can be parameters: String, Long, Date, and Double. The identifying flag is used to indicate if the parameter is to be used as part of the identification of a job instance.

я думаю, что лучше всего было бы либо создать таблицу в БД, которая хранит список параметров и передать идентификатор этой записи как JobParameter или сериализовать список json и передать его как String в качестве JobParameter. Если вы идете со вторым вариантом, помните, что string_val хранится в БД как varchar 250, поэтому предел составляет 250 символов.

Смежные вопросы