Как обращаться с ThreadPool / ExecutorService весной

1

Я хочу обрабатывать несколько потоков в модели весны mvn. Я написал этот код

@RequestMapping("/indialCall")
    @ResponseBody
    public String indialCall(HttpServletRequest request) {
    String result = "FAIL";
    try {
        Map<String, String> paramList = commonUtilities.getParamList(request);
        logger.info("indialCall paramList :::" + paramList);
//      System.out.println("indial-call paramList :::" + paramList);
        result = inDialHandler.processIndialWork(paramList);
        logger.info(result);
    } catch (Exception e) {
        logger.info("Error :" + e);
    }

    return result;
    }




public String processIndialWork(final Map<String, String> paramList) {

                final Boolean sendSms = Boolean.parseBoolean(paramList.get(constantService.getSendSms()));
                //assume it is always true
                if(true){
                        Thread thread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            String sessionId = (String) paramList.get(constantService.getInDialSession());
                            String msisdn = (String) paramList.get(constantService.getInDialMsisdn());
                            //This method will save the entry into database
                            saveMissedCall(callStartDate, sessionId, msisdn, vmnNo, advId, enterpriseId, sendSms, advertiser);
                        }
                    });
                    thread.start();
                    return "1";
                }
                }

В этом коде я использую создание потока для каждого HTTP-запроса. Что плохо для моего дела. потому что система получает 50 запросов/сек. и когда я вижу использование процессора, он слишком высок.

            I am calling this thread for async communication so that calling party can get response instantly
            and later on application do the further processing.

            I want to use the Executor service but do not know how to do this. Can some one guide me or can write 
            few line of code for me to implment the correct thread pool executor. 
Теги:
multithreading
spring

1 ответ

2
Лучший ответ

Сначала определите простой TaskExecutor в вашем файле конфигурации.

  <bean id="taskExecutor"
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <property name="corePoolSize" value="5" />
    <property name="maxPoolSize" value="10" />
    <property name="WaitForTasksToCompleteOnShutdown" value="true" />
</bean>

Создайте весеннюю фасоль с пространством прототипа (прототип важен, поскольку вы хотите дать каждому потоку разные данные), и они будут работать одновременно.

Этот весенний боб будет реализовывать runnable с помощью метода run и будет иметь переменный paramlist переменной уровня для получения значений.

 public class MyRunnableBean implements runnable{
   private Map<String, String> paramList();
// add setter
 public void run(){
        // your logic



 }


}

Выполняющий выполнение задачи (singleton) в вашем существующем bean-компоненте, получите экземпляры этого runnable bean-компонента в вашем существующем bean-компоненте, задайте paramlist и добавьте его в исполнитель:

   MyRunnableBEan myRunnableBEan = applicationContext.getBean("myRunnable");
   myRunnableBean.setParamList(/* your paramlist*/ );
   taskExecutor.execute(myRunnableBean);

Исправьте ошибку компиляции и синтаксиса, этот пример кода написан на блокноте, у меня нет java на моей машине.

  • 0
    Я сделал то же самое в коде. но еще одна вещь, чтобы спросить. Должен ли я объявить <bean id = "taskExecutor" исполнителя задачи в качестве прототипа. Таким образом, исполнитель будет создаваться при каждом отдельном запросе. Пожалуйста поправьте меня.
  • 0
    нет, taskExecutor должен быть одноэлементным, иначе у вас будет много потоков, используемых каждым исполнителем, однако ваш исполняемый компонент должен быть прототипом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню