Программно наберите номер телефона и передайте DTMF с помощью iPhone SDK

Ваша проблема в том, что вы неправильно поняли цель сервлета . Он намерен действовать по HTTP-запросам, не более того. Вам нужна только фоновая задача, которая выполняется один раз на ежедневной основе.

Доступен EJB? Используйте @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.
    }

} 

Да, это действительно все. Контейнер автоматически подберет и управляет им.

EJB недоступен? Используйте 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 для запланированных задач с использованием таймера .

30
задан Cœur 4 April 2017 в 12:21
поделиться

4 ответа

iPhone SDK НЕ предоставляет Вам прямой доступ для набирания номеров (вообразите, вошла ли 'плохая' программа телефон и набрала плату на мелкое число на бесшумном режиме, таким образом, Вы не заметили).

Однако при использовании ссылки телефона, тогда необходимо быть в состоянии отправить ее"", символы, который вставляет паузы.

Так для набора номера 555-1212 затем ожидайте 4 секунды, затем сделайте 12345# на сенсорном тоне, Вы использовали бы tel:5551212, 12345#

Выезд https://developer.apple.com/library/archive/featuredarticles/iPhoneURLScheme_Reference/PhoneLinks/PhoneLinks.html

31
ответ дан Cœur 4 April 2017 в 12:21
поделиться
  • 1
    Производительность ExecutorService был оценен благоприятно здесь ( stackoverflow.com/a/27025552/2116890 ), где это было полно решимости быть потрясающим. В этом случае они имели дело с большим количеством потоков. По моему опыту, использовать ли единственный поток или многих, I' ve никогда не замечал издержки, но I' ve также не приложил усилия, чтобы всегда измерить его уровень относительно альтернативы. – user2116890 4 March 2017 в 06:45

Вы не можете сделать этого. SDK не позволяет Вам, управляют телефонной функцией в этом уровне детализации.

-1
ответ дан Alex Wayne 4 April 2017 в 12:21
поделиться
  • 1
    В основном методе это должно быть Thread timeOutThread = new Thread(timeOut); тогда @Johannes, тайм-аут использовался бы. – Arjun Varshney 6 October 2017 в 10:36

На самом деле, я только что попробовал следующий 555-555-4822 EXT 8030

И, похоже, он передает некоторые тональные сигналы даже после нажатия на циферблат (число p представляет собой количество секунд задержки ). Однако тональные сигналы на дальнем конце не реагируют, как ожидалось, так что что-то по-прежнему не так.

Это действительно работает, хотя немного больше подвержено проблемам с синхронизацией тел: 555-555-4822, 8030. Это просто приостанавливается на одну секунду (,, будет две секунды) после подключения, а затем воспроизводит 8030 тонов

0
ответ дан 27 November 2019 в 23:57
поделиться

По приведенной выше ссылке разработчика Apple Адама, есть ссылка RFC, которая объясняет больше о различных вариантах схемы телефонной связи, поддерживаемой iPhone -

http://www.ietf.org/rfc/rfc2806 .txt

Это, по крайней мере, позволяет вставлять паузы с 'p' в URL-адресе, но многие параметры указаны (но не все обязательны) в RFC. Что еще работает?

2
ответ дан 27 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: