Я пытаюсь создать поток экрана, запланированный в Salesforce. Из потока экрана я вызываю метод Invocable, в котором я передаю свои входные параметры из потока экрана. Оттуда я вызываю будущий метод, который передает эти значения, а затем, наконец, делаю вызов POST. Моя единственная проблема заключается в том, чтобы запланировать это сейчас. Изначально мне не нужно было отправлять параметры, и у меня было следующее:

global class MyScheduler implements Schedulable {
    global void execute(SchedulableContext sc) {        
        MyCallouts.makeFuturePostCall();
    }    
}

Теперь мне нужно отправить 2 строки из этого метода (makeFuturePostCall). Или, может быть, я думаю об этом неправильно. Любые идеи? Я просто хочу иметь возможность планировать этот поток экрана после того, как я получил ввод от пользователя.

Чтобы быть немного более понятным, у меня есть экран, который позволяет пользователю вводить некоторые параметры. Эти параметры передаются методу Invocable. После того, как я получу эту информацию, я хочу иметь возможность запланировать ее выполнение без какого-либо взаимодействия с пользователем. Просто продолжайте работать с теми же двумя параметрами.

 @InvocableMethod
public static void makeInvocableCall(List<MyInputs> test) {
    futureCall(test[0].param1, test[0].param2);
}
0
MarkC5000 29 Июл 2019 в 22:32
Чтобы уточнить: то, что вы хотите запланировать, не является самим Потоком, верно? Это Апекс. И вы заинтересованы в том, чтобы передать этому Apex некоторые параметры, которые в конечном итоге исходят из Flow? Не могли бы вы изменить, чтобы уточнить и включить класс InvocableApex?
 – 
David Reed
29 Июл 2019 в 22:23
Я добавил еще немного информации. Я мог запланировать это раньше из метода будущего (futureCall без отправленных параметров), когда мне не нужно было отправлять параметры. Но теперь, когда я знаю, я не знаю, как я могу запланировать это. И да, я хочу запланировать вершину, которая получает параметры из потока.
 – 
MarkC5000
29 Июл 2019 в 22:33

1 ответ

Лучший ответ

Ваш класс Schedulable может принимать параметры, которые затем передаются будущему вызову. В качестве примечания: если вы не создаете управляемый пакет и не собираетесь предоставлять этот класс потребителям, он не должен быть global.

Просто добавьте конструктор и переменные экземпляра, а затем выполните вызов:

public class MyScheduler implements Schedulable {
    private String param1;
    private String param2;

    public MyScheduler(String param1, String param2) {
        this.param1 = param1;
        this.param2 = param2;
    }

    public void execute(SchedulableContext sc) {        
        MyCallouts.makeFuturePostCall(param1, param2);
    }    
}

Ваш Invocable Apex должен создать экземпляр запланированного класса, передав нужные параметры, а затем вызвать System.schedule().

Этот шаблон отлично работает, даже если ваши параметры не являются примитивами, как показано здесь. Они просто должны быть сериализуемыми, и я ожидаю, что любое значение, выходящее из потока, будет таким.

1
David Reed 29 Июл 2019 в 23:16
Спасибо, Дэвид. Я попытался реализовать, как вы указали выше. Затем я попытался запланировать вершину на внешнем интерфейсе с помощью кнопки Schedule Apex, и мне было сказано, что для этого мне нужно выбрать класс Apex без параметров. Я предполагаю, что именно поэтому вы сказали, что мне нужно использовать System.schedule(). Я просто вызываю System.schedule('The Name',Expression,MyScheduler) внутри makeInvocableCall перед моим futureCall()?
 – 
MarkC5000
31 Июл 2019 в 18:52
1
Да, после создания экземпляра MyScheduler с передачей нужных параметров.
 – 
David Reed
31 Июл 2019 в 19:02