Служба 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, чтобы я мог запустить их позже.
Мне здесь чего-то не хватает?