Служба Java прекращает работу, когда срабатывает отклоненное выполнение

Служба Java прекращает работу, когда срабатывает отклоненное выполнение

У меня есть запущенный mqtt-клиент, который действует как мост/сервер для приложений Android и пула баз данных для MySQL, и когда отклоненное выполнение вызывает остановку моей службы, мне действительно интересно, почему.

Это мой пул потоков

public static ExecutorService threadPool = new ThreadPoolExecutor(10, // core size
    30, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20),
    factory,
    new  DiscardPolicy()); // queue with a size

Объявление, как работает мое сообщение

@Override
public void messageArrived(final String topic, final MqttMessage message) throws Exception {
    threadPool.execute(new Runnable(){
        void run(){
            if(topic.equalsIgnoreCase("something")){} // and code goes on like these
        }
    // code
     });



     try{
            if(Constants.pendingRunnables.size() > 0){
                for(java.util.Map.Entry<ThreadPoolExecutor, Runnable> runner : Constants.pendingRunnables.entrySet()){

//                  runner.getKey().execute(runner.getValue());
                    try{
                        if (!runner.getKey().isShutdown()) {
                            runner.getValue().run();
                            Constants.pendingRunnables.remove(runner.getKey());
                        }
                    }catch(Exception ex){

                    }

                }
            }
        }catch(Exception e){}

}

public class DiscardPolicy extends ThreadPoolExecutor.DiscardPolicy{
    private static final Logger LOGGER = Logger.getLogger(DiscardPolicy.class);
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        // TODO Auto-generated method stub
        super.rejectedExecution(r, e);
        Constants.pendingRunnables.put(e, r);
        LOGGER.info("Rejected Runnable ");

    }

}

В некоторых исполняемых файлах есть клиент mqtt, чтобы они могли публиковать ответ. Что делает эта служба, так это запускает runnables, и когда срабатывает исключение, я добавляю их к ожидающим runnables, чтобы я мог запустить их позже.

Мне здесь чего-то не хватает?


person david    schedule 08.11.2015    source источник
comment
Вы можете проверить, что ExecutorService отключен? CallerRunsPoilicy — это обработчик отклоненных задач, который запускает отклоненную задачу непосредственно в вызывающем потоке метода execute, если исполнитель не был закрыт, и в этом случае задача отбрасывается.   -  person Ravindra babu    schedule 08.11.2015
comment
да, я проверил это и поймал исключение, но проблема все еще существует, я заменил его на DiscardPolicy и запустил их позже.   -  person david    schedule 08.11.2015
comment
Моя служба сейчас работает, но я жду отклоненного исключения. Есть ли у меня другой способ проверить отклоненное исключение?   -  person david    schedule 08.11.2015
comment
И я поместил отлов Runtime Exception в свой REHandler для runnables, чтобы я мог перехватывать RuntimeException и в Runnables   -  person david    schedule 08.11.2015
comment
@ravindra посмотри мою правку   -  person david    schedule 08.11.2015
comment
Я реализовал ответ Хольгера и получил RejectionHandler в соответствии с: stackoverflow.com/questions/30782611/   -  person Ravindra babu    schedule 08.11.2015
comment
@ravindra реализация holger касается экземпляра вызываемых объектов, в то время как моя проблема заключается в том, когда выполнение отказа вызывает остановку моей службы, похоже на тупик или что-то, что я пропускаю. Возможно, я что-то делаю не так с моим кодом?   -  person david    schedule 17.11.2015