Step 1
わざとガバナエラーを発生させてみよう!
簡単なロジックを Apex のみで記述し、手っ取り早くガバナエラーを再現します。
検証用の SFDX プロジェクトを作成
まずは SFDX プロジェクトを作成します。
コピー sf generate project -n MyFunctionProject
cd MyFunctionProject
yarn install
code .
検証用の Apex クラスを作成
次に、検証用の Apex クラスを作成してみます。開発者コンソールでも良いですが、VS Code を利用することをおすすめします。
force-app/main/default/classes/CaseDemo.cls
コピー public class CaseDemo {
public static Integer countLoop(Integer numStart, Integer numEnd) {
Integer result = numStart;
while (result < numEnd) {
result++;
}
return result;
}
}
与えられた引数だけループするだけのプログラムになります。 例えば CaseDemo.countLoop(0, 100)
と実行すると、100 回ループし、100
を返却します。 単純なプログラムですね!
実際に実行してみましょう。VS Code を利用して Apex を匿名実行し、デバッグログを見てみます。
scripts/apex/check-governor.apex
コピー /**
* check-governor.apex
*/
String result = '';
result += '\n';
result += '\n';
// 引数を自由に変えて Maximum CPU time を確認
result += CaseDemo.countLoop(0, 2000000);
result += '\n';
System.debug('\n==================================================');
System.debug(result);
System.debug('\n==================================================');
演習問題 1.1
必ず正常終了するようなループ回数は、何回未満でしょうか?
演習問題 1.2
必ずガバナエラーが発生するようなループ回数は、何回以上でしょうか?
Step 2
同じロジックを Salesforce Functions に置き換えてみよう!
今度は同じロジックを JavaScript で記述し、ガバナエラーを回避できることを簡単に確認します。
Salesforce Functions で Hello, World!!
次のコマンドを実行して、 Salesforce Functions の雛形を用意しましょう。
コピー sf generate function -n myfunction -l javascript
何よりもまず、Hello World をしてみます。
functions/myfunction/index.js
コピー export default async function (event, context, logger) {
const result = 'Hello, World!!';
return result;
}
ローカルサーバで Salesforce Functions を起動させます。 VS Code のターミナルから次のコマンドを実行します。
コピー cd functions/myfunction
sf run function start
ローカルサーバで Salesforce Functions を起動させたまま、別のターミナルから Salesforce Functions を呼び出します。 -p
でパラメータを渡すことができます。
コピー sf run function -l http://localhost:8080 -p '{}'
いい感じにできましたね。次は、Step1 と同様のロジックを記述し、再実行してみます。
functions/myfunction/index.js
コピー export default async function (event, context, logger) {
// const result = 'Hello, World!!';
let result = event.data.numStart;
while (result < event.data.numEnd) {
result++;
}
return result;
}
コピー sf run function -l http://localhost:8080 -p '{"numStart":0,"numEnd":2000000}'
演習問題 2.1
Step1 でガバナエラーだった回数をループさせた場合、エラーは発生するでしょうか?
Step 3
他にも色々なサンプルコードを動かしてみよう!
ここまでは Salesforce のデータを扱うロジックがなかったのでいまいちでしたが、もちろん Salesforce Functions でも Salesforce のデータを扱うことができます。しかも、けっこう簡単に書けてしまうことを体感してみましょう。
Salesforce からデータを検索!
context.org.dataApi.query()
を実行するだけです。
functions/myfunction/index.js
コピー export default async function (event, context, logger) {
// const result = 'Hello, World!!';
// let result = event.data.numStart;
// while (result < event.data.numEnd) {
// result++;
// }
const result = await context.org.dataApi.query(
'SELECT Id, Name FROM Account'
);
return result;
}
Hint: Salesforce Functions を使ったとしても、5 万件以上を検索しようとするとガバナエラーが発生してしまいます。
Salesforce にデータを登録!
context.org.dataApi.newUnitOfWork().registerCreate()
を実行します。
functions/myfunction/index.js
コピー export default async function (event, context, logger) {
// const result = 'Hello, World!!';
// let result = event.data.numStart;
// while (result < event.data.numEnd) {
// result++;
// }
const uow = context.org.dataApi.newUnitOfWork();
const referenceId = await uow.registerCreate({
type: 'Case',
fields: {
subject: 'demo',
},
});
const response = await context.org.dataApi.commitUnitOfWork(uow);
const caseId = response.get(referenceId).id;
const result = await context.org.dataApi.query(
// 'SELECT Id, Name FROM Account'
`SELECT Id, CaseNumber,Subject FROM Case WHERE Id = '${caseId}'`
);
return result;
}
Hint: Salesforce Functions を使ったとしても、150 件以上を一括登録しようとするとガバナエラーが発生してしまいます。
演習問題 3.1
他にどんなことができそうか、調べてみましょう。