ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®ãŠã©ãŒã¯ã¹ã«ãŒãšãã£ãã·ã¥èšºæ
åŠç¿ã®ç®ç
ãã®åå ãå®äºãããšã次ã®ããšãã§ããããã«ãªããŸãã
- ãã£ãã·ã¥ããŒã¿ã®ä¿åãšæŽæ°ã®ãã¿ãŒã³ã説æããã
- ãã£ãã·ã¥å€ã«äœ¿çšããããŒã¿æ§é ãæ±ºå®ããã
- ãã£ãã·ã¥ã®äœ¿çšç¶æ³ã蚺æããã
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®ãŠã©ãŒã¯ã¹ã«ãŒ
çµç¹ãã£ãã·ã¥ã䜿çšããŠé貚æç®ã¬ãŒããä¿åããã³ååŸããæ¹æ³ãå®èšŒãããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ãèŠãŠãããŸããããæç®ã¬ãŒãã¯æ¥äžå€åããããããã®ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãªã¢ã«ã¿ã€ã ã®ã¬ãŒãã¯è¿ããŸãããæç®ã¬ãŒãã®æ¥æ¬¡ã¹ãããã·ã§ããã®ã¿ãæäŸããŸããããã§ã¯æ£ç¢ºãªãªã¢ã«ã¿ã€ã ã®å€ã§ã¯ãªãæ¥æ¬¡ã®å€ã«ã®ã¿é¢å¿ãããã®ã§ãé貚æç®ã¬ãŒãã¯ãã£ãã·ã¥å¯Ÿè±¡ãšããŠããéžæã§ããæç®ã¬ãŒããç¹°ãè¿ãååŸããå Žåããã£ãã·ã¥ããååŸããããšã§æéãå€§å¹ ã«ç¯çŽããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãé«ããããšãã§ããŸãã
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®æŠèŠ
æç®ã¬ãŒããµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã®ããŒã¹ã¯ãVisualforce ããŒãžãšãæç®ã¬ãŒããååŸããããžãã¯ãå«ãŸãã Apex ã³ã³ãããŒã©ãŒã§ããæåã«ãã®ããŒãžãã¢ã¯ã»ã¹ããããšããå€éš Web ãµãŒãã¹ãžã® API ã³ãŒã«ã«ãã£ãŠã¬ãŒããååŸãããŸãããã®ããŒãžã®æ¬¡å以éã®å®è¡ã§ã¯ããã£ãã·ã¥ã®ã¬ãŒãã 1 æ¥ä»¥äžåã®ãã®ã§ãªããã°ãã£ãã·ã¥ããã¬ãŒããè¿ãããŸããæç®ã¬ãŒãããšã«ããã®ããŒãžã«ã¯åºæ¬é貚ã察象é貚ãæç®ã¬ãŒãã衚瀺ãããŸããäŸç€ºãç®çã§ãããããè¿ãããã®ã¯å°èŠæš¡ãªé貚ã®ã»ããã§ãã

次ã®äŸã¯ãVisualforce ããŒãžã®ããŒã¯ã¢ããã§ãããã®ããŒãžã¯ãExchangeRates Apex ã³ã³ãããŒã©ãŒã«é¢é£ä»ããããŠããŸãã
<apex:page controller="ExchangeRates" action="{!init}">
<apex:pageBlock title="Rates">
<apex:pageBlockTable value="{!Rates}" var="rate">
<apex:column value="{!rate.Base_Currency__c}"/>
<apex:column value="{!rate.To_Currency__c}"/>
<apex:column value="{!rate.Rate__c }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>ãµã³ãã« Apex ã³ã³ãããŒã©ãŒ
ãã®ãµã³ãã« Apex ã³ã³ãããŒã©ãŒã§ã¯å€ãã®åŠçãè¡ããŸããæç®ã¬ãŒããååŸããSalesforce ãšãã£ãã·ã¥ã«ä¿åãããã£ãã·ã¥ããã¬ãŒããååŸããŸãã以äžã¯ããµã³ãã«ã³ã³ãããŒã©ãŒãå®è¡ããæäœã®å èš³ãšããã®ãœãŒã¹ã³ãŒãã§ãã
ååã®ãµã³ãã«å®è¡ã§ã¯ãæ¬¡ã®æäœãå®è¡ãããŸãã
- å€éšãšã³ããã€ã³ããžã® API ã³ãŒã«ããæç®ã¬ãŒããååŸãããŸãã
- API ã³ãŒã«ããè¿ãããçµæ (JSON 圢åŒ) ãè§£æãããSalesforce ã® Exchange_Rate__c sObject ã«ä¿åãããŸãã
- getCachedRates() ã¡ãœããã Exchange_Rate__c sObject ã®é
åãçµç¹ãã£ãã·ã¥ã«ä¿åããŸãã
2 åç®ä»¥éã®ãµã³ãã«å®è¡ã§ã¯ãæ¬¡ã®æäœãå®è¡ãããŸãã
- ãµã³ãã«ãä¿åãããããŒã¿ã®é®®åºŠããã§ãã¯ããŸãããã®ããã«ãSOQL ã¯ãšãªãå®è¡ããŠååã§è¿ããã Exchange_Rate__c ã¬ã³ãŒãã® createdDate å€ãååŸããŸãã
- æ¥ä»ã 1 æ¥ä»¥äžåã®å Žåãååã®å®è¡ãšåæ§ã« API ã³ãŒã«ã§æç®ã¬ãŒããååŸãããŸãã
- æ¥ä»ã 1 æ¥ä»¥å
ã®å Žåãã¬ãŒãã¯çµç¹ãã£ãã·ã¥ããååŸãããŸãããã£ãã·ã¥ã®æ¬ èœãããå Žåãã¬ãŒã㯠Exchange_Rate__c sObject ããç
§äŒãããŠçµç¹ãã£ãã·ã¥ã«ä¿åãããŸãã
public class ExchangeRates {
private String currencies = 'EUR,GBP,CAD,PLN,INR,AUD,SGD,CHF,MYR,JPY,CNY';
public String getCurrencies() { return currencies;}
public Exchange_Rate__c[] rates {get; set;}
//
// Checks if the data is old and gets new data from an external web service
// through a callout. Calls getCachedRates() to manage the cache.
//
public void init() {
// Let's query the latest data from Salesforce
Exchange_Rate__c[] latestRecords = ([SELECT CreatedDate FROM Exchange_Rate__c
WHERE Base_Currency__c =:RateLib.baseCurrencies
AND forList__c = true
ORDER BY CreatedDate DESC
LIMIT 1]);
// If what we have in Salesforce is old, get fresh data from the API
if ( latestRecords == null
|| latestRecords.size() == 0
|| latestRecords[0].CreatedDate.date() < Datetime.now().date()) {
// Do API request and parse value out
String tempString = RateLib.getLoadRate(currencies);
Map<String, String> apiStrings = RateLib.getParseValues(
tempString, currencies);
// Let's store the data in Salesforce
RateLib.saveRates(apiStrings);
// Remove the cache key so it gets refreshed in getCachedRates()
Cache.Org.remove('Rates');
}
// Call method to manage the cache
rates = getCachedRates();
}
//
// Main method for managing the org cache.
// - Returns exchange rates (Rates key) from the org cache.
// - Checks for a cache miss.
// - If there is a cache miss, returns exchange rates from Salesforce
// through a SOQL query, and updates the cached value.
//
public Exchange_Rate__c[] getCachedRates() {
// Get the cached value for key named Rates
Exchange_Rate__c[] rates = (Exchange_Rate__c[])Cache.Org.get(
RateLib.cacheName+'Rates');
// Is it a cache miss?
if(rates == null) {
// There was a cache miss so get the data via SOQL
rates = [SELECT Id, Base_Currency__c, To_Currency__c, Rate__c
FROM Exchange_Rate__c
WHERE Base_Currency__c =:RateLib.baseCurrencies
AND forList__c = true
AND CreatedDate = TODAY];
// Reload the cache
Cache.Org.put(RateLib.cacheName+'Rates', rates);
}
return rates;
}
}Exchange Rates (æç®ã¬ãŒã) ãµã³ãã«ã®ãœãŒã¹ãããŠã³ããŒãããŠãDeveloper çµç¹ã§è©Šãå Žåã¯ãããªãœãŒã¹ãã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ãã£ãã·ã¥ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
ãã£ãã·ã¥ä¿åã®ãã¿ãŒã³
ExchangeRates Apex ã¯ã©ã¹ã«ã¯ããã£ãã·ã¥ã®åæåãšæŽæ°ã®ããžãã¯ãã«ãã»ã«åããã¡ãœãããå«ãŸããŠããŸããããŒã¿ãå€ãããèŠã€ãããªãå Žåãinit() ã¡ãœããã API ã³ãŒã«ã§æ°ããæç®ã¬ãŒããååŸããSalesforce ã«ä¿åããŸããgetCachedRates() ã¡ãœããããã£ãã·ã¥ãå éšçã«ç®¡çããŸãããã£ãã·ã¥å€ãèŠã€ãããªãå Žåããã®ã¡ãœãã㯠Salesforce ããã¬ãŒãã®é åãååŸãããã£ãã·ã¥ã«ä¿åããŸãã
ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã§ã¯å€éšããŒã¿ã䜿çšãããããAPI ã³ãŒã«ãä»ã㊠Web ãµãŒãã¹ããããŒã¿ãååŸããŸãããŸãããã£ãã·ã¥ãæŽæ°ããããã®ããã¯ã¢ãããšããŠããŒã¿ã Salesforce ã¬ã³ãŒãã«ä¿åããŸããå€éšããŒã¿ã䜿çšããªãã¢ããªã±ãŒã·ã§ã³ã¯ãSOQL ã䜿çšã㊠Salesforce ã¬ã³ãŒããååŸãããã£ãã·ã¥ããŸãããã®å Žåã®æ¹ããã£ãã·ã¥ç®¡çã®ããã»ã¹ãç°¡åã§ããã£ãã·ã¥ã¡ãœããã®å®è£ ãç°¡æœã«ãªããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ã SOQL ããã®ããŒã«ã«ããŒã¿ã ãã䜿çšããå Žåãinit() ã¡ãœããã¯äžèŠã§ãgetCachedRates() ã¡ãœããã®ã¿ãå¿ èŠã§ãã
ãã£ãã·ã¥ã管çããããžãã¯ã®ãã¹ãŠã 1 ã€ã®ã¡ãœããã«å«ããããšããå§ãããŸããããã«ããããã£ãã·ã¥ã¯ã¢ããªã±ãŒã·ã§ã³ã® 1 ãæã§ã®ã¿æäœãããŸãããã£ãã·ã¥ãäžå€®ç®¡çããããšã§ãç¡å¹ãªãã£ãã·ã¥ (ãã£ãã·ã¥ã®æ¬ èœ) ãžã®ã¢ã¯ã»ã¹ãæå³ããªããã£ãã·ã¥å€ã®äžæžããããšã©ãŒãçºçããå¯èœæ§ãäžããããšãã§ããŸãã
ãã£ãã·ã¥å¯Ÿè±¡ã®æ±ºå®
ãã®ãµã³ãã«ã¯ãsObject ã®é åããã£ãã·ã¥ã«ä¿åããŸãããã®ã¢ãããŒãã§ãä¿åããããŒã¿æ§é ãšããŠæé©ãªéžæè¢ã¯ã©ãã§ãããã? ã©ã®éžæè¢ã«ããã¬ãŒããªãããããŸããsObject å šäœã§ã¯ãªããé ç®å€ãªã©å°ããªåäœã®ããŒã¿ãä¿åãããšããã£ãã·ã¥äœ¿çšãµã€ãºãå°ããããããšãã§ããŸããäžæ¹ã§ãåããŒã§ä¿åããããŒã¿ãå°ãªããªããšãããŒã¿ãš sObject ãåæ§ç¯ããããã«è€éãªããžãã¯ãå¿ èŠã«ãªããåŠçæéãé·ããªãå¯èœæ§ããããŸãããŸãã1 ã€ã®ããŒã« sObject ã®é åãä¿åããå Žåã䜿çšããããã£ãã·ã¥ç©ºéã¯ãåã ã®ããŒã«ä¿åãããåã ã® sObjects ã®åèšãµã€ãºãããå°ãããªããŸããé ç®ã®ãªã¹ãã§ã¯ãªããããå°ããé ç®ããã£ãã·ã¥ãããšã鿬¡åãšãã£ãã·ã¥ã®ã³ãããæéã®ãªãŒããŒãããã«ãããããã©ãŒãã³ã¹ãäœäžããŸããããšãã°ãã¬ãŒãã®ãªã¹ã (次ã®ã¹ããããã§ã¯ã¬ãŒã倿°ã§åç §) ãä¿åãã代ããã«ã
Cache.Org.put('Rates', rates);åã ã®ã¬ãŒãããããããç¬èªã®ããŒãæã€é ç®ãšããŠæ¬¡ã®ããã«ä¿åã§ããŸãã
Cache.Org.put('DollarToEuroRate', rateEUR);
Cache.Org.put('DollarToChineseYuan', rateCNY);
Cache.Org.put('DollarToJapaneseYen', rateJPY);
// etc.ãã£ãã·ã¥ããããŒã¿æ§é ã®æ±ºå®ã¯ãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«ããŒã¿ãåŠçãããã«äŸåããŸããããšãã°ãã¢ããªã±ãŒã·ã§ã³ãåãåºæ¬é貚ããé貚ãæç®ããå°ãªããšã察象é貚ããšã«æç®ã¬ãŒããä¿åãããšããŸãããã®å Žåãåé貚ã¬ãŒããåå¥ã®ããŒãšããŠä¿åã§ããŸãããã ããVisualforce ããŒãžã«ã¬ãŒãã衚瀺ããã«ã¯ãããŒã¿ã sObject ã®ãªã¹ããšããŠãã£ãã·ã¥ããã»ããç°¡åã§ããsObject ã«ã¯äœææ¥ãªã©ã®ã·ã¹ãã é ç®ãå«ãŸããŠãããããä¿åé åã¯å¢å ããå¯èœæ§ããããŸãããããžãã¯åŠçæéãçããªããã¢ããªã±ãŒã·ã§ã³ãšãã£ãã·ã¥ã®ããã©ãŒãã³ã¹ãåäžããŸãããã£ãã·ã¥ã䜿çšãããšããæå€§ã®ç®æšã¯ã¢ããªã±ãŒã·ã§ã³å®è¡æéã®ççž®ã§ããããšã念é ã«çœ®ããŠãã ããã
ãã£ãã·ã¥äœ¿çšç¶æ³ã®èšºæ
ãã©ãããã©ãŒã ãã£ãã·ã¥ãå®è£ ããããã®äœæ¥ã¯ãã¹ãŠå®äºããŸãããã ãã£ãã·ã¥ãæé©ã«äœ¿çšããŠãããã©ããã¯ã©ã調ã¹ãã°ããã®ã§ãããã? ããã©ãŒãã³ã¹ããŒã¿ã確èªããæ¹æ³ã¯ããã€ããããŸãããã® 1 ã€ã¯ã[èšå®] ã§èšºææ å ±ãåç §ããæ¹æ³ã§ã (Salesforce Classic ã§ã®ã¿äœ¿çšå¯èœ)ã
蚺æããŒãžã«ã¢ã¯ã»ã¹ããåã«ããŠãŒã¶ãŒã®ãã£ãã·ã¥èšºææš©éãæå¹ã«ããŸãã
- [èšå®] ããã[ã¯ã€ãã¯æ€çŽ¢] ããã¯ã¹ã«ããŠãŒã¶ãŒããšå
¥åãã[ãŠãŒã¶ãŒ] ãéžæããŸãã
- ãŠãŒã¶ãŒã®ååãã¯ãªãã¯ãã[ç·šé] ãã¯ãªãã¯ããŸãã
-
[ãã£ãã·ã¥èšºæ] ãéžæãã[Save (ä¿å)] ãã¯ãªãã¯ããŸãã
次ã«ãããŒãã£ã·ã§ã³ã®ç¹å®ã®ãã£ãã·ã¥çš®å¥ã®èšºæããŒãžã«ã¢ã¯ã»ã¹ããŸãã
- [èšå®] ããã[ã¯ã€ãã¯æ€çŽ¢] ããã¯ã¹ã«ããã£ãã·ã¥ããšå
¥åãã[ãã©ãããã©ãŒã ãã£ãã·ã¥] ãéžæããŸãã
- 蚺ææ
å ±ã確èªããããŒãã£ã·ã§ã³ãã¯ãªãã¯ããŸãã
- ã»ãã·ã§ã³ãã£ãã·ã¥ãŸãã¯çµç¹ãã£ãã·ã¥ã®äžã§ã[Diagnostics (蚺æ)] ãã¯ãªãã¯ããŸãã

çµç¹ãã£ãã·ã¥ã® [蚺æ] ãã¯ãªãã¯ãããšãçµç¹ãã£ãã·ã¥ã®èšºæããŒãžãæ°ããã¿ãã§éããŸãããã®ããŒãžã«ã¯ 2 ã€ã®ã°ã©ãã衚瀺ãããŸããæåã®ã°ã©ã (Org Cache Capacity and Usage (çµç¹ãã£ãã·ã¥å®¹éãšäœ¿çšç)) ã«ã¯ãã£ãã·ã¥ã®äœ¿çšå¶éã衚瀺ãããŸãããã®ã±ãŒã¹ã§ã¯ãå¶éãããã¯ããã«äœã 0.02% ã䜿çšãããŠããŸãã2 ã€ç®ã®ã°ã©ã (By Content Contribution (ã³ã³ãã³ãé åå¥)) ã¯ãããŒå¥ã®ã³ã³ãã³ãé åã瀺ãããŒããã°ã©ãã§ãã
次ã®ç»åã¯ã4 ã€ã®ãã£ãã·ã¥ããŒãå«ãã³ã³ãã³ãé åã°ã©ãã瀺ããŸãããã£ãã·ã¥ããŒã® 1 ã€ã§ãã Rates ã¯ãæç®ã¬ãŒããµã³ãã«ã§äœ¿çšãããŠããŸããRates ããŒãåå以äžã®ç©ºéã䜿çšããŠããŸãã

ã°ã©ãã®åŸã«ã¯ãã£ãã·ã¥ããŒã®è©³çްãªã¹ãã衚瀺ãããŸãããã®ãªã¹ãã«ã¯ãããŒã«å¯Ÿå¿ããåãã£ãã·ã¥å€ã®ãµã€ãºãšããã£ãã·ã¥ãã¢ã¯ã»ã¹ãããåæ°ã衚瀺ãããŸããApex ã§ remove() ã¡ãœãããã³ãŒã«ãã代ããã«ããã®ãªã¹ãããæåã§ãã£ãã·ã¥ãåé€ã§ããŸãã[åé€] ãã¿ã³ã䜿çšãããšãã³ãŒãã倿Žããã«ã·ã¹ãã 管çè ããã£ãã·ã¥ã管çã§ããŸãã
DollarToEuroRate ããŒã¯ Rates ããŒãããã¯ããã«å°ãªã空éã䜿çšããŠããŸããDollarToEuroRate ãä¿åããã®ã¯ 1 ã€ã®å€ã®ã¿ã§ãRates ãä¿åããã®ã¯ sObject ã®é åã§ãããããããã¯äºæž¬ã©ããã§ãã
蚺æããŒãžã®æ å ±ã䜿çšããŠããã£ãã·ã¥ã®äœ¿çšã調æŽãããã©ããã倿ããŸããããšãã°ããã£ãã·ã¥å€ã®ã¢ã¯ã»ã¹ä»¶æ°ãå°ãªãå Žåãã€ãŸãã»ãšãã©äœ¿çšãããŠããªãå Žåã¯ããããæ¬åœã«å¿ èŠããæ€èšããŸã (ç¹ã«å€§ããå Žå)ããã£ãã·ã¥äœ¿çšå¶éã«è¿ã¥ããŠããå Žåã¯ããã£ãã·ã¥ãã察象ã忀èšããŸããäžå¿ èŠãªãã£ãã·ã¥ã®åé€ãããã£ãã·ã¥å®¹éã®è¿œå è³Œå ¥ãå¿ èŠã«ãªããããããŸããã
ãç²ãæ§ã§ããããã©ãããã©ãŒã ãã£ãã·ã¥ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ããã£ãã·ã¥ããååŸãé«éåããæ¹æ³ãåŠç¿ããŸããããã£ãã·ã¥ã®ãã¹ããã©ã¯ãã£ã¹ãšãã£ãã·ã¥äœ¿çšç¶æ³ã®èšºææ¹æ³ãåŠç¿ããŸãããããã§ãã€ã§ãã·ããªã¹ã®åéºã«åå ããŠã貎éãªãªãœãŒã¹ããã£ãã·ã¥ã§ããããã«ãªããŸããã
ãªãœãŒã¹
- Salesforce éçºè : Platform Cache Best Practices (ãã©ãããã©ãŒã ãã£ãã·ã¥ã®ãã¹ããã©ã¯ãã£ã¹)
- GitHub: Exchange Rates Sample App (æç®ã¬ãŒããµã³ãã«ã¢ããªã±ãŒã·ã§ã³)
