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

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

منبع وجود ندارد

پیام خطا

استقرار پروکسی 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 در سطح پروکسی API، محیط یا سازمان وجود نداشته باشد، پیاده‌سازی پروکسی API با شکست مواجه می‌شود.

تشخیص

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

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

    برای مثال، سیاست زیر مقدار 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ها کد وضعیت ۴۰۴ دریافت کردید، یعنی منبع مورد نظر هم در سطح سازمان و هم در سطح محیط وجود ندارد.

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

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

وضوح تصویر

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

برای اصلاح مثال سیاست JavaCallout که در بالا نشان داده شده است، فایل JAR را در سطح مناسب (پروکسی API، سطح سازمان یا محیط) آپلود کنید .

بدون منبع برای آدرس اینترنتی

پیام خطا

استقرار پروکسی 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"

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

وضوح تصویر

  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 در فضای ابری استفاده می‌کنید، با پشتیبانی Apigee تماس بگیرید. اگر کاربر فضای ابری خصوصی هستید، به بخش شروع، توقف، راه‌اندازی مجدد و بررسی وضعیت Apigee Edge مراجعه کنید.

جاواکال‌اوتاینستنتیشن ناموفق

پیام خطا

استقرار پروکسی 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 حاوی کلاس جاوا که در خطا شناسایی شده است، آپلود نشده است.
فایل JAR خراب فایل JAR حاوی کلاس جاوا که در خطا شناسایی شده است، خراب است/به طور ناقص آپلود شده است.
فایل کلاس موجود نیست فایل کلاس جاوا که در خطا شناسایی شده است، بخشی از فایل JAR مشخص شده در >ResourceURL< یا فایل‌های JAR وابسته نیست.
مشکل کد جاوا خطایی در کد وجود دارد، مانند فقدان سازنده، مشکل وابستگی کد یا مشکل دیگر.

مراحل تشخیص رایج

  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 در هیچ یک از سطوح آپلود نشده است، به بخش وضوح (Resolution) بروید.
  3. اگر فایل JAR آپلود شده است، به قسمت «علت: فایل JAR خراب» بروید.

وضوح تصویر

  1. اگر فایل JAR خراب شده یا بخشی از آن آپلود شده است، JAR را بازسازی کنید و فایل JAR را در سطح مناسب (API proxy، organization یا environment level) آپلود کنید .
  2. پروکسی API را مجدداً مستقر کنید.

علت: فایل JAR خراب

تشخیص

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

وضوح تصویر

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

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

تشخیص

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

وضوح تصویر

  1. فایل JAR را با فایل(های) کلاس از دست رفته بازسازی کنید و فایل JAR را در سطح مناسب (API proxy، organization یا environment level) آپلود کنید .
  2. پروکسی API را مجدداً مستقر کنید.

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

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

تشخیص

  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. بسته به علت خرابی، ممکن است لازم باشد مشکل را در کد جاوا خود برطرف کنید.
  2. فایل JAR را با فایل(های) کلاس از دست رفته بازسازی کنید و فایل JAR را در سطح مناسب (API proxy، organization یا environment level) آپلود کنید .
  3. پروکسی API را مجدداً مستقر کنید.

فایل JAR را آپلود کنید

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

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

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

    برای مثال، فراخوانی 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"