عیب‌یابی خطای زمان اجرای خط‌مشی JavaCallout

درحال مشاهده اسناد Apigee Edge هستید.
به اسناد Apigee X بروید.
اطلاعات

ResourceDoesNotExist

پیام خطا

استقرار پراکسی API ازطریق «واسط کاربر Edge» یا «میانای برنامه‌سازی کاربردی مدیریت Edge» با این پیام خطا ناموفق است:

Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.

نمونه پیام خطا

Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.

نماگرفت خطای نمونه

علت

اگر منبع مشخص‌شده در عنصر <ResourceURL> در خط‌مشی JavaCallout در سطح میانای برنامه‌سازی کاربردی، محیط، یا سازمان وجود نداشته باشد، استقرار میانای برنامه‌سازی کاربردی ناموفق خواهد بود.

تشخیص

  1. نام محیط و منبع را شناسایی کنید. می‌توانید این اطلاعات را در پیام خطا پیدا کنید. برای مثال، در خطای زیر، محیط test و نام منبع استفاده‌شده در عنصر <ResourceURL>‏ myresource.jar است.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. خط‌مشی JavaCallout را که از منبع شناسایی‌شده در مرحله ۱ بالا استفاده می‌کند تعیین کنید.

    برای مثال، خط‌مشی زیر مقدار <ResourceURL> را به‌عنوان myresource.jar مشخص می‌کند که با مقدار موجود در پیام خطا مطابقت دارد:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JavaCallout name="hello-java">
        <ClassName>com.apigeesample.HelloJava</ClassName>
        <ResourceURL>java://myresource.jar</ResourceURL>
    </JavaCallout>
    
  3. تعیین کنید که آیا منبع بخشی از پراکسی API است که با خطا مواجه شده است یا در سطح محیط یا سازمان بارگذاری شده است. اگر این‌طور نیست، این دلیل خطا است.

    • برای مشاهده همه منابع بارگذاری‌شده در سطح پراکسی API، به زبانه «منابع» در قاب «پیمایشگر» ویرایشگر پراکسی API پیمایش کنید. در این مثال، کارگزار نیابتی API هیچ منبع بارگذاری‌شده‌ای ندارد.

    • منابع می‌توانند در سطح محیط یا سازمان دردسترس باشند. برای اطلاعات بیشتر، فایل‌های منبع را ببینید.

      • برای تعیین اینکه منبع در سطح محیط وجود دارد یا نه، بااستفاده از curl، تماس API زیر را صادر کنید: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • برای تعیین اینکه آیا منبع در سطح سازمان وجود دارد یا نه، بااستفاده از curl، تماس API زیر را بدون ذکر جزئیات محیط صادر کنید: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      اگر کد وضعیت ۴۰۴ را به‌عنوان پاسخ این میاناهای برنامه‌سازی کاربردی دریافت کردید، یعنی منبع در سطح سازمان و محیط وجود ندارد.

    اگر منبع در سطح پراکسی API، سازمان، و محیط دردسترس نباشد، خطای استقرار برگردانده می‌شود:

    Resource with name myresource.jar and type java does not exist.
     ```
    

وضوح

مطمئن شوید منبع مشخص‌شده در عنصر <ResourceURL> در سطح پراکسی API، محیط، یا سازمان وجود داشته باشد. برای اطلاعات بیشتر، فایل‌های منبع را ببینید.

برای اصلاح خط‌مشی JavaCallout مثال نشان‌داده‌شده در بالا، فایل JAR را بارگذاری کنید در سطح مناسب (کارگزار نیابتی API، سازمان، یا سطح محیط).

NoResourceForURL

پیام خطا

استقرار پراکسی API ازطریق «واسط کاربر Edge» یا «میانای برنامه‌سازی کاربردی مدیریت Edge» با این پیام خطا ناموفق است:

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL <var>ResourceURL</var>

نمونه پیام خطا

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar

نماگرفت خطای نمونه

علت

این خطا ممکن است زمانی رخ دهد که فایل منبع خراب یا به‌صورت ناقص بارگذاری شده باشد، حتی اگر به‌نظر برسد در سطح پراکسی API، محیط، یا سازمان وجود دارد.

تشخیص

  1. محیط و نام منبع را شناسایی کنید. می‌توانید این اطلاعات را در پیام خطا پیدا کنید. برای مثال، در خطای زیر، نام محیط test و «نام منبع» استفاده‌شده در عنصر <ResourceURL>‏ myresource.jar است.

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
    
  2. مطمئن شوید که منبع در سطح پراکسی API، محیط، یا سازمان بارگذاری شده است. در مثال زیر، می‌بینید که منبع myresource.jar در سطح پراکسی API بارگذاری شده است.

    منابع می‌توانند در سطح محیط یا سازمان دردسترس باشند. برای اطلاعات بیشتر، فایل‌های منبع را ببینید.

    برای تعیین اینکه منبع در سطح محیط وجود دارد یا نه، بااستفاده از curl، تماس API زیر را صادر کنید: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    برای تعیین اینکه منبع در سطح سازمان وجود دارد یا نه، بااستفاده از curl، تماس API زیر را بدون ذکر جزئیات محیط صادر کنید: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    اگر کد وضعیت ۴۰۴ را به‌عنوان پاسخ این «میاناهای برنامه‌سازی کاربردی» دریافت کردید، یعنی منبع در سطح سازمان و محیط وجود ندارد.

وضوح

  1. اگر تشخیص دادید که منبع در سطح پراکسی API، سازمان، یا محیط وجود دارد، منبع را حذف کنید و آن را دوباره بارگذاری کنید، همان‌طور که در مرحله ۲ توضیح داده شده است. درغیراین‌صورت، به مرحله ۳ بروید.
  2. برای حذف منبع در سطح پراکسی API، به برگه «منابع» در قاب «پیمایشگر» ویرایشگر پراکسی API بروید و روی دکمه «X» در کنار منبع کلیک کنید، همان‌طور که در زیر نشان داده شده است.

    برای حذف منبع در سطح محیط یا سازمان، از فعل DELETE در فراخوان‌های API که قبلاً در مراحل تشخیص خرابی استفاده شده است استفاده کنید. برای مثال، برای حذف منبع در سطح محیط، فرمان زیر را وارد کنید: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. فایل JAR را در سطح مناسب (کارگزار نیابتی API، سازمان، یا سطح محیط) بارگذاری کنید.

  4. اگر بارگذاری مجدد منبع کمکی نکرد، «پردازنده‌های پیام» تحت‌تأثیر قرارگرفته باید بازراه‌اندازی شوند. اگر از Apigee Edge در Cloud استفاده می‌کنید، با پشتیبانی Apigee تماس بگیرید. اگر کاربر «ابر خصوصی» هستید، شروع، توقف، بازراه‌اندازی، و بررسی وضعیت Apigee Edge را ببینید.

JavaCalloutInstantiationFailed

پیام خطا

استقرار پراکسی API ازطریق «واسط کاربر Edge» یا «میانای برنامه‌سازی کاربردی مدیریت Edge» با این پیام خطا ناموفق است:

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class <var>class_name</var>

یا

Error in deployment for environment <var>environment</var>.
The revision is deployed and traffic can flow, but flow may be impaired. Failed to instantiate the JavaCallout Class <var>class_name</var>

نمونه پیام خطا

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class

نماگرفت خطای نمونه

علت

در اینجا دلایل معمول این خطا آورده شده است

علت شرح
فایل JAR وجود ندارد فایل JAR حاوی کلاس Java که در خطا شناسایی شده است بارگذاری نشده است.
فایل JAR خراب فایل JAR حاوی کلاس Java که در خطا شناسایی شده است خراب است/به‌طور ناقص بارگذاری شده است.
فایل «کلاس» وجود ندارد فایل کلاس Java که در خطا شناسایی شده است بخشی از فایل JAR مشخص‌شده در >ResourceURL< یا فایل‌های JAR وابسته نیست.
مشکل کد Java خطایی در کد وجود دارد، مثلاً سازنده وجود ندارد، مشکل وابستگی کد وجود دارد، یا مشکل دیگری وجود دارد.

مرحله تشخیص خرابی مشترک

  1. نام محیط و «کلاسی» را که وارد نشده است شناسایی کنید. برای مثال، در پیام خطای زیر، نام محیط test و نام کلاس my.class است:

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
    
    

    دلیل: فایل JAR وجود ندارد

تشخیص

  1. فایل JAR را که قرار است حاوی کلاس باشد (در مرحله ۱ بالا شناسایی شده است) و نمی‌تواند نمونه‌سازی شود مشخص کنید.
  2. بررسی کنید که آیا فایل JAR خاص در سطح پراکسی API، سازمان، یا محیط بارگذاری شده است یا خیر. اگر فایل JAR در هیچ‌یک از سطوح بارگذاری نشده است، به «وضوح» بروید.
  3. اگر فایل JAR بارگذاری شد، به علت: فایل JAR خراب بروید.

وضوح

  1. اگر فایل JAR خراب است یا به‌طور ناقص بارگذاری شده است، JAR را بازسازی کنید و فایل JAR را در سطح مناسب (پراکسی API، سازمان، یا سطح محیط) بارگذاری کنید.
  2. پراکسی میانای برنامه‌سازی کاربردی را دوباره مستقر کنید.

دلیل: فایل JAR خراب است

تشخیص

  1. فایل JAR را که باید حاوی کلاسی باشد که نمی‌تواند نمونه‌سازی شود (در مرحله ۱ بالا شناسایی شده است) تعیین کنید.
  2. بررسی کنید که آیا فایل JAR خاص خراب است یا خیر. برای مثال، اگر نمی‌توانید فایل را از حالت فشرده خارج کنید زیرا خراب است یا به‌طور ناقص بارگذاری شده است. اگر خراب است، به «وضوح» بروید.
  3. اگر فایل JAR خراب نیست، به علت: فایل کلاس وجود ندارد بروید.

وضوح

  1. فایل(های) JAR خراب‌شده را بازسازی کنید و فایل JAR را در سطح مناسب (کارگزار نیابتی API، سازمان، یا سطح محیط) بارگذاری کنید.
  2. پراکسی میانای برنامه‌سازی کاربردی را دوباره مستقر کنید.

علت: فایل کلاس وجود ندارد

تشخیص

  1. بررسی کنید که آیا فایل کلاس جاوا مشخص‌شده (شناسایی‌شده در مرحله ۱ بالا) بخشی از فایل JAR مشخص‌شده در >ResourceURL< یا هریک از فایل‌های JAR وابسته است یا نه.
  2. اگر فایل کلاس در هیچ‌یک از فایل‌های JAR وجود ندارد، علت خطا را مشخص کرده‌اید. به «وضوح» بروید.
  3. اگر فایل کلاس در یکی از فایل‌های JAR مشخص‌شده در خط‌مشی JavaCallout وجود داشته باشد، پس باید مشکلی در کد جاوا یا کلاس وابسته وجود داشته باشد که منجر به این خطا می‌شود. الف. اگر کاربر «ابر عمومی» هستید، با پشتیبانی Apigee تماس بگیرید. ب. اگر کاربر «ابر خصوصی» هستید، به علت: مشکل کد جاوا بروید.

وضوح

  1. ‫JAR را با فایل(های) کلاس ازدست‌رفته بازسازی کنید و فایل JAR را در سطح مناسب (کارگزار نیابتی API، سازمان، یا سطح محیط) بارگذاری کنید.
  2. «پراکسی میانای برنامه‌سازی کاربردی» را دوباره مستقر کنید.

علت: مشکل کد جاوا

مراحل تشخیص خرابی فقط برای کاربران «ابر خصوصی»

تشخیص

  1. گزارش‌های «پردازشگر پیام» (/opt/apigee/var/log/edge-message-processor/system.log و /opt/apigee/var/log/edge-message-processor/configurations.log) را بررسی کنید.
  2. ممکن است استثنایی مشابه مثال زیر ببینید:

    2019-07-05 05:40:13,240 org:myorg env:staging target:/organizations/myorg/apiproxies/MyAPI/revisions/5 action:add context-id: mode: Apigee-Main-53 ERROR CONFIG-CHANGE - AbstractConfigurator.add() : Add null to Step failed, reason: {}
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class <class name>
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:116)
    at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:218)
    …<snipped>
    Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.access$100(JavaCalloutStepDefinition.java:41)
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition$CallOutWrapper.initialize(JavaCalloutStepDefinition.java:131)
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition$CallOutWrapper.<init>(JavaCalloutStepDefinition.java:126)
    ... 42 common frames omitted
    Caused by: <Reason>
    
    ...<snipped>
    
    
  3. استثنا را به‌دقت بخوانید تا دلیل عدم موفقیت را متوجه شوید. معمولاً این خطا به مشکلی در کد جاوا شما اشاره دارد.

وضوح

  1. بسته به دلیل عدم موفقیت، ممکن است لازم باشد مشکل را در کد Java خود برطرف کنید.
  2. ‫JAR را با فایل(های) کلاس ازدست‌رفته بازسازی کنید و فایل JAR را در سطح مناسب (کارگزار API، سازمان، یا سطح محیط) بارگذاری کنید.
  3. «پراکسی میانای برنامه‌سازی کاربردی» را دوباره مستقر کنید.

بارگذاری فایل JAR

مطمئن شوید که عنصر منبع با همه کلاس‌های ضروری در سطح «پراکسی میانای برنامه‌سازی کاربردی»، محیط، یا سازمان وجود دارد. برای اطلاعات بیشتر، فایل‌های منبع را ببینید.

  1. برای بارگذاری منبع در سطح پراکسی API، روی + (علامت به‌علاوه) در برگه «منابع» کلیک کنید، سپس وارد کردن فایل را انتخاب کنید و فایل را از ماشین محلی خود بارگذاری کنید. نام فایل باید با عنصر >ResourceURL< مطابقت داشته باشد، اما بدون پیشوند java://.

  2. اگر می‌خواهید منبعی در بیش‌از یک پراکسی API در یک محیط دردسترس باشد، منبع را در محیط بارگذاری کنید. همان‌طور که در فایل‌های منبع توضیح داده شده است، باید از Edge API استفاده کنید.

    برای مثال، تماس API زیر را از ماشین محلی وارد کنید تا فایل مشخص‌شده را در سطح محیط بارگذاری کنید:

    curl -v -u email -H "Content-Type: application/octet-stream" \
    -X POST --data-binary @{classes.jar} \
    "http://{mgmt_server}:{port}/v1/organizations/myorg/environments/myenv/resourcefiles?name=myresouce.jar&type=java"
    

    تماس با API را از همان دایرکتوری فایل انجام دهید.

  3. برای اینکه فایل را برای همه پراکسی‌های API در همه محیط‌های سازمان دردسترس قرار دهید، می‌توانید جزئیات محیط را در مسیر پایه حذف کنید. برای مثال:

    curl -v -u email -H "Content-Type: application/octet-stream" \
    -X POST --data-binary @{classes.jar} \
    "http://{mgmt_server}:{port}/v1/organizations/myorg/resourcefiles?name=myresouce.jar&type=java"