इस गाइड में, Java क्लाइंट लाइब्रेरी के कुछ ज़्यादा बेहतर पहलुओं को पसंद के मुताबिक बनाने का तरीका बताया गया है. आम तौर पर, इनमें से कई सुविधाएं स्टैंडर्ड सुविधा वाले तरीकों के बजाय, Callable पर निर्भर करती हैं. आम तौर पर, callable में RPC के हिसाब से काम करने वाली अन्य सुविधाओं के बारे में जानकारी मिलती है. हालांकि, यहां उनके बारे में नहीं बताया गया है.
टाइम आउट की संख्या
Java लाइब्रेरी, हर कॉल के लिए टाइमआउट सेट करने की सुविधा देती है.
डिफ़ॉल्ट वैल्यू, googleads_grpc_service_config.json में method_config/timeout सेटिंग के आधार पर सेट की जाती है. अगर आपको एपीआई कॉल के लिए ज़्यादा से ज़्यादा समय की सीमा कम करनी है, तो वैल्यू कम पर सेट करें.
इस सुविधा का इस्तेमाल करने के लिए, Callable ऑब्जेक्ट को सीधे तौर पर कॉल करें. उदाहरण के लिए, GoogleAdsService.searchStream() को कॉल करते समय, टाइम आउट को इस तरह सेट करें:
try (GoogleAdsServiceClient googleAdsServiceClient =
googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
// Constructs the SearchGoogleAdsStreamRequest.
SearchGoogleAdsStreamRequest request =
SearchGoogleAdsStreamRequest.newBuilder()
.setCustomerId(Long.toString(customerId))
.setQuery("SELECT campaign.id, campaign.name FROM campaign")
.build();
// Executes the API call with a timeout of 5 minutes.
ServerStream<SearchGoogleAdsStreamResponse> stream =
googleAdsServiceClient
.searchStreamCallable()
.call(
request,
GrpcCallContext.createDefault()
.withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
for (SearchGoogleAdsStreamResponse response : stream) {
// Processes the response rows.
}
}
टाइम आउट की अवधि को दो घंटे या उससे ज़्यादा पर सेट किया जा सकता है. हालांकि, एपीआई अब भी बहुत ज़्यादा समय तक चलने वाले अनुरोधों के लिए टाइम आउट हो सकता है और DEADLINE_EXCEEDED गड़बड़ी का मैसेज दिखा सकता है.
अगर यह समस्या आती है, तो आम तौर पर क्वेरी को अलग-अलग हिस्सों में बांटकर, उन्हें एक साथ चलाना सबसे अच्छा होता है. इससे ऐसी स्थिति से बचा जा सकता है जहां लंबे समय तक चलने वाला अनुरोध पूरा न हो पाए. साथ ही, अनुरोध को फिर से शुरू करने के अलावा कोई और तरीका न हो.
सेटिंग फिर से लागू करने की कोशिश करें
Java लाइब्रेरी, हर कॉल के हिसाब से फिर से कोशिश करने की सेटिंग को कॉन्फ़िगर करने के लिए भी एक प्लैटफ़ॉर्म उपलब्ध कराती है. इस सुविधा का इस्तेमाल करने के लिए, Callable ऑब्जेक्ट को सीधे तौर पर कॉल करें. उदाहरण के लिए, GoogleAdsService.searchStream() को कॉल करते समय, फिर से कोशिश करने की सेटिंग को इस तरह कॉन्फ़िगर करें:
try (GoogleAdsServiceClient googleAdsServiceClient =
googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
SearchGoogleAdsStreamRequest request =
SearchGoogleAdsStreamRequest.newBuilder()
.setCustomerId(Long.toString(customerId))
.setQuery("SELECT campaign.id, campaign.name FROM campaign")
.build();
// Creates a context object with the custom retry settings.
GrpcCallContext context =
GrpcCallContext.createDefault()
.withRetrySettings(
RetrySettings.newBuilder()
.setInitialRetryDelay(Duration.ofMillis(10L))
.setMaxRetryDelay(Duration.ofSeconds(10L))
.setRetryDelayMultiplier(1.4)
.setMaxAttempts(10)
.setLogicalTimeout(Duration.ofSeconds(30L))
.build());
// Issues the streaming search request.
ServerStream<SearchGoogleAdsStreamResponse> stream =
googleAdsServiceClient.searchStreamCallable().call(request, context);
for (SearchGoogleAdsStreamResponse response : stream) {
// Processes the response rows.
}
}
स्टार्टअप टाइम की परफ़ॉर्मेंस को ऑप्टिमाइज़ करना
GoogleAdsClient का पहला इंस्टेंस बनाने में, आपको थोड़ी देरी दिख सकती है. ऐसा सेवाओं के लिए फ़्लुएंट इंटरफ़ेस (GoogleAdsClient.getLatestVersion()) की वजह से होता है. यह एपीआई सेवा क्लास को एक साथ लोड करता है, ताकि सेवा क्लाइंट बनाने के लिए आसान तरीका उपलब्ध कराया जा सके.
अगर पहले अनुरोध की परफ़ॉर्मेंस, आपके ऐप्लिकेशन के लिए ज़रूरी है, तो यह तरीका अपनाएं:
उपयोगकर्ता के अनुरोधों को पूरा करने से पहले, स्टार्टअप पर
GoogleAdsClientबनाएं.जब प्रोसेस पहली बार शुरू हो, तब Google Ads API को कुछ वार्म-अप अनुरोध भेजें. उदाहरण के लिए:
// Runs some warm-up requests. try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { // Runs 5 warm-up requests. In our profiling we see that 90% of // performance loss is only experienced on the first API call. After 3 // subsequent calls we saw a negligible improvement in performance. for (int i = 0; i < 5; ++i) { // Warm-up queries are run with a nonexistent CID so the calls will // fail. If you have a CID that you know will be accessible with the // OAuth credentials provided you may want to provide that instead and // avoid the try-catch. try { googleAdsServiceClient.search("-1", "Warm-up query"); } catch (ApiException ex) { // Do nothing, we're expecting this to fail. } } }
वार्म-अप के अनुरोध, हर प्रोसेस के लिए सिर्फ़ एक बार चलाने होते हैं. इसके बाद, हर सेवा क्लाइंट के लिए, पहले से लोड की गई क्लास का इस्तेमाल अपने-आप होता है.
सेवा के क्लाइंट का दोबारा इस्तेमाल
आपको सर्विस क्लाइंट इंस्टेंस का फिर से इस्तेमाल करना चाहिए. ऐसा इसलिए, क्योंकि GoogleAdsClient.getLatestVersion().createYYYServiceClient() या वर्शन के हिसाब से ऐक्सेस करने वाले getVersion25() जैसे हर कॉल से, नया कनेक्शन और उससे जुड़े संसाधन बनते हैं.
जब सेवा क्लाइंट की ज़रूरत न हो, तो उसे बंद करना न भूलें. इसे try-with-resources ब्लॉक में किया जा सकता है. इसके अलावा, सर्विस क्लाइंट पर close() को कॉल करके भी ऐसा किया जा सकता है.
अगर एपीआई अनुरोध करने के लिए, बंद किए गए सेवा क्लाइंट का इस्तेमाल किया जाता है, तो सेवा क्लाइंट का तरीका java.util.concurrent.RejectedExecutionException दिखाता है.
अगर JAR फ़ाइल का साइज़ 32 एमबी से ज़्यादा है, तो App Engine उसे डिप्लॉय नहीं कर पाएगा
App Engine में, अपलोड की गई हर फ़ाइल के लिए 32 एमबी का कोटा होता है. google-ads के लिए JAR का साइज़ इससे काफ़ी बड़ा होता है. खास तौर पर, शेड या शैडो JAR डिप्लॉयमेंट का इस्तेमाल करते समय. अगर JAR को मैन्युअल तरीके से डिप्लॉय किया जाता है, तो आपको ये गड़बड़ियां मिल सकती हैं:
ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-46.1.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])
इसके बजाय, App Engine के Gradle प्लगिन या Maven प्लगिन का इस्तेमाल करके डिप्लॉय करें. हर प्लगिन में एक enableJarSplitting
विकल्प होता है. यह हर JAR को 10 एमबी के हिस्सों में बांटता है और उन्हें अपलोड करता है.
शैडो डिपेंडेंसी
अगर आपके प्रोजेक्ट में ऐसी डिपेंडेंसी हैं जो लाइब्रेरी की डिपेंडेंसी के साथ काम नहीं करती हैं, तो यहां दिए गए किसी एक कमांड का इस्तेमाल करके, अपने प्रोजेक्ट की डिपेंडेंसी के क्रम की जांच करें. इसके बाद, ज़रूरत के मुताबिक अपने प्रोजेक्ट की डिपेंडेंसी में बदलाव करें या बिल ऑफ़ मटीरियल का इस्तेमाल करें:
Maven
mvn dependency:treeग्रेडल
./gradlew dependenciesअगर डिपेंडेंसी से जुड़ी समस्याओं को ठीक नहीं किया जा सकता, तो लाइब्रेरी के शेड किए गए वर्शन का इस्तेमाल करें:
Maven
<dependency> <groupId>com.google.api-ads</groupId> <artifactId>google-ads-shadowjar</artifactId> <version>46.1.0</version> </dependency>
ग्रेडल
implementation 'com.google.api-ads:google-ads-shadowjar:46.1.0'