Ваша проблема в том, что вы неправильно поняли цель сервлета . Он намерен действовать по HTTP-запросам, не более того. Вам нужна только фоновая задача, которая выполняется один раз на ежедневной основе.
@Schedule
Если ваша среда поддерживает EJB (например, WildFly, JBoss AS / EAP, TomEE, GlassFish и т. Д.), Тогда используйте @Schedule
.
@Singleton
public class BackgroundJobManager {
@Schedule(hour="0", minute="0", second="0", persistent=false)
public void someDailyJob() {
// Do your job here which should run every start of day.
}
@Schedule(hour="*/1", minute="0", second="0", persistent=false)
public void someHourlyJob() {
// Do your job here which should run every hour of day.
}
@Schedule(hour="*", minute="*/15", second="0", persistent=false)
public void someQuarterlyJob() {
// Do your job here which should run every 15 minute of hour.
}
}
Да, это действительно все. Контейнер автоматически подберет и управляет им.
ScheduledExecutorService
Если ваша среда не поддерживает EJB (то есть не настоящий Java EE-сервер, например Tomcat, Jetty и т. Д.), Используйте ScheduledExecutorService
. Это может быть инициировано ServletContextListener
. Вот пример kickoff:
@WebListener
public class BackgroundJobManager implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new SomeDailyJob(), 0, 1, TimeUnit.DAYS);
scheduler.scheduleAtFixedRate(new SomeHourlyJob(), 0, 1, TimeUnit.HOURS);
scheduler.scheduleAtFixedRate(new SomeQuarterlyJob(), 0, 15, TimeUnit.MINUTES);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
Если классы заданий выглядят следующим образом:
public class SomeDailyJob implements Runnable {
@Override
public void run() {
// Do your daily job here.
}
}
public class SomeHourlyJob implements Runnable {
@Override
public void run() {
// Do your hourly job here.
}
}
public class SomeQuarterlyJob implements Runnable {
@Override
public void run() {
// Do your quarterly job here.
}
}
java.util.Timer
/ java.lang.Thread
в Java EE Никогда не используйте java.util.Timer
и / или java.lang.Thread
в Java EE. Это рецепт неприятностей. Подробное объяснение можно найти в этом ответе JSF по одному и тому же вопросу: Истеризация потоков в управляемом компоненте JSF для запланированных задач с использованием таймера .
iPhone SDK НЕ предоставляет Вам прямой доступ для набирания номеров (вообразите, вошла ли 'плохая' программа телефон и набрала плату на мелкое число на бесшумном режиме, таким образом, Вы не заметили).
Однако при использовании ссылки телефона, тогда необходимо быть в состоянии отправить ее"", символы, который вставляет паузы.
Так для набора номера 555-1212 затем ожидайте 4 секунды, затем сделайте 12345# на сенсорном тоне, Вы использовали бы tel:5551212, 12345#
Вы не можете сделать этого. SDK не позволяет Вам, управляют телефонной функцией в этом уровне детализации.
Thread timeOutThread = new Thread(timeOut);
тогда @Johannes, тайм-аут использовался бы.
– Arjun Varshney
6 October 2017 в 10:36
На самом деле, я только что попробовал следующий 555-555-4822 EXT 8030
И, похоже, он передает некоторые тональные сигналы даже после нажатия на циферблат (число p представляет собой количество секунд задержки ). Однако тональные сигналы на дальнем конце не реагируют, как ожидалось, так что что-то по-прежнему не так.
Это действительно работает, хотя немного больше подвержено проблемам с синхронизацией тел: 555-555-4822, 8030. Это просто приостанавливается на одну секунду (,, будет две секунды) после подключения, а затем воспроизводит 8030 тонов
По приведенной выше ссылке разработчика Apple Адама, есть ссылка RFC, которая объясняет больше о различных вариантах схемы телефонной связи, поддерживаемой iPhone -
http://www.ietf.org/rfc/rfc2806 .txt
Это, по крайней мере, позволяет вставлять паузы с 'p' в URL-адресе, но многие параметры указаны (но не все обязательны) в RFC. Что еще работает?