Rozwiązywanie problemów związanych z błędami w działaniu zasad JavaCallout w czasie działania

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

ResourceDoesNotExist

Komunikat o błędzie

Wdrożenie serwera proxy interfejsu API za pomocą interfejsu Edge lub interfejsu Edge Management API kończy się niepowodzeniem i wyświetlany jest ten komunikat o błędzie:

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

Przykładowy komunikat o błędzie

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

Zrzut ekranu z przykładowym błędem

Przyczyna

Jeśli zasobu wskazanego w elemencie <ResourceURL> w zasadzie JavaCallout nie ma na poziomie serwera proxy interfejsu API, środowiska lub organizacji, wdrożenie serwera proxy interfejsu API nie powiedzie się.

Diagnostyka

  1. Określ nazwę środowiska i zasobu. Informacje te znajdziesz w komunikacie o błędzie. Na przykład w poniższym błędzie środowisko to test, a nazwa zasobu w elemencie <ResourceURL> to myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Określ zasadę JavaCallout, która korzysta z zasobu wskazanego w kroku 1 powyżej.

    Na przykład ta zasada określa wartość <ResourceURL> jako myresource.jar, która odpowiada wartości z komunikatu o błędzie:

    <?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. Sprawdź, czy zasób należy do serwera proxy interfejsu API, w przypadku którego występuje problem albo został przesłany na poziomie środowiska lub organizacji. Jeśli nie, to jest przyczyną błędu.

    • Aby wyświetlić wszystkie zasoby przesłane na poziomie serwera proxy interfejsu API, przejdź do karty Zasoby w panelu Nawigatora w edytorze proxy interfejsu API. W tym przykładzie serwer proxy interfejsu API nie ma przesłanych żadnych zasobów.

    • Zasoby mogą być dostępne na poziomie środowiska lub organizacji. Więcej informacji znajdziesz w artykule Pliki zasobów.

      • Aby sprawdzić, czy zasób istnieje na poziomie środowiska, wykonaj to wywołanie interfejsu API za pomocą narzędzia curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Aby sprawdzić, czy zasób istnieje na poziomie organizacji, wykonaj to wywołanie interfejsu API za pomocą narzędzia curl z pominięciem szczegółów środowiska: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Jeśli w odpowiedzi dla tych interfejsów API otrzymasz kod stanu 404, oznacza to, że zasobu nie ma na poziomie organizacji i środowiska.

    Jeśli zasób jest niedostępny na poziomie serwera proxy interfejsu API, organizacji lub środowiska, zwracany jest błąd wdrożenia:

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

Rozdzielczość

Sprawdź, czy zasób określony w elemencie <ResourceURL> istnieje na poziomie serwera proxy interfejsu API, środowiska lub organizacji. Więcej informacji znajdziesz w artykule Pliki zasobów.

Aby poprawić przykładową zasadę JavaCallout, prześlij plik JAR na odpowiednim poziomie (serwera proxy interfejsu API, organizacji lub środowiska).

NoResourceForURL

Komunikat o błędzie

Wdrożenie serwera proxy interfejsu API za pomocą interfejsu Edge lub interfejsu Edge Management API kończy się niepowodzeniem i wyświetlany jest ten komunikat o błędzie:

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>

Przykładowy komunikat o błędzie

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

Zrzut ekranu z przykładowym błędem

Przyczyna

Ten błąd może wystąpić, jeśli plik zasobów jest uszkodzony lub został częściowo przesłany, nawet jeśli wydaje się, że istnieje na poziomie serwera proxy interfejsu API, środowiska lub organizacji.

Diagnostyka

  1. Zidentyfikuj środowisko i nazwę zasobu. Informacje te znajdziesz w komunikacie o błędzie. Na przykład w poniższym błędzie nazwa środowiska to test, a nazwa zasobu w elemencie <ResourceURL> to 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. Sprawdź, czy zasób został przesłany na poziomie serwera proxy interfejsu API, środowiska lub organizacji. W poniższym przykładzie widać, że zasób myresource.jar został przesłany na poziomie serwera proxy interfejsu API.

    Zasoby mogą być dostępne na poziomie środowiska lub organizacji. Więcej informacji znajdziesz w artykule Pliki zasobów.

    Aby sprawdzić, czy zasób istnieje na poziomie środowiska, wykonaj to wywołanie interfejsu API za pomocą narzędzia curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Aby sprawdzić, czy zasób istnieje na poziomie organizacji, wykonaj to wywołanie interfejsu API za pomocą narzędzia curl z pominięciem szczegółów środowiska: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Jeśli w odpowiedzi dla tych interfejsów API otrzymasz kod stanu 404, oznacza to, że zasobu nie ma na poziomie organizacji i środowiska.

Rozdzielczość

  1. Jeśli stwierdzisz, że zasób istnieje na poziomie serwera proxy interfejsu API, organizacji lub środowiska, usuń go i prześlij ponownie, jak opisano w kroku 2. W przeciwnym razie przejdź do kroku 3.
  2. Aby usunąć zasób na poziomie serwera proxy interfejsu API, przejdź do karty Zasoby w panelu nawigacji w edytorze proxy interfejsu API i kliknij przycisk „X” obok zasobu, jak pokazano poniżej.

    Aby usunąć zasób na poziomie środowiska lub organizacji, użyj czasownika DELETE w wywołaniach interfejsu API, które zostały wcześniej użyte w krokach diagnostyki. Aby na przykład usunąć zasób na poziomie środowiska, wpisz to polecenie: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Prześlij plik JAR) na odpowiednim poziomie (serwer proxy interfejsu API, organizacji lub środowiska).

  4. Jeśli ponowne przesłanie zasobu nie pomoże, należy ponownie uruchomić procesory wiadomości, których dotyczy ten problem. Jeśli używasz Apigee Edge w Cloud, skontaktuj się z zespołem pomocy Apigee. Jeśli korzystasz z Private Cloud, zapoznaj się z artykułem na temat uruchamiania, zatrzymywania, ponownego uruchamiania i sprawdzania stanu Apigee Edge.

JavaCalloutInstantiationFailed

Komunikat o błędzie

Wdrożenie serwera proxy interfejsu API za pomocą interfejsu Edge lub interfejsu Edge Management API kończy się niepowodzeniem i wyświetlany jest ten komunikat o błędzie:

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>

lub

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>

Przykładowy komunikat o błędzie

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

Zrzut ekranu z przykładowym błędem

Przyczyna

Oto typowe przyczyny tego błędu

Przyczyna Opis
Brak pliku JAR Plik JAR zawierający klasę Java zidentyfikowaną w błędzie nie został przesłany.
Uszkodzony plik JAR Plik JAR zawierający klasę Java zidentyfikowaną w błędzie jest uszkodzony lub został częściowo przesłany.
Brak pliku zajęć Plik klasy Java wskazany w błędzie nie jest częścią pliku JAR określonego w atrybucie >ResourceURL< ani zależnych plików JAR.
Problem z kodem w Java W kodzie jest błąd, np. brak konstruktora, problem z zależność kodu lub inny problem.

Częsty etap diagnostyki

  1. Zidentyfikuj nazwę środowiska i klasy, której nie udało się zaimportować. Na przykład w tym przykładzie nazwa środowiska z komunikatem o błędzie to test, a nazwa klasy to my.class:

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

    Przyczyna: brak pliku JAR

Diagnostyka

  1. Określ plik JAR, który powinien zawierać klasę (określoną w kroku 1 powyżej), i którego nie można utworzyć.
  2. Sprawdź, czy konkretny plik JAR został przesłany na poziomie serwera proxy interfejsu API, organizacji lub środowiska. Jeśli plik JAR nie został przesłany na żaden z poziomów, przejdź do sekcji Rozdzielczość.
  3. Jeśli plik JAR został przesłany, przejdź do artykułu Przyczyna: uszkodzony plik JAR.

Rozdzielczość

  1. Jeśli plik JAR jest uszkodzony lub został przesłany częściowo, ponownie utwórz plik JAR i prześlij plik JAR na odpowiednim poziomie (serwera proxy interfejsu API, organizacji lub środowiska).
  2. Ponownie wdróż serwer proxy interfejsu API.

Przyczyna: uszkodzony plik JAR

Diagnostyka

  1. Określ plik JAR, który powinien zawierać klasę (określoną w kroku 1 powyżej), której nie można utworzyć.
  2. Sprawdź, czy konkretny plik JAR nie jest uszkodzony. Jeśli na przykład nie możesz rozpakować pliku, ponieważ jest uszkodzony lub został przesłany częściowo. Jeśli jest uszkodzony, przejdź do Rozwiązanie.
  3. Jeśli plik JAR nie jest uszkodzony, przejdź do artykułu Przyczyna: brak pliku zajęć.

Rozdzielczość

  1. Odbuduj uszkodzone pliki JAR i prześlij plik JAR na odpowiedni poziom (serwer proxy interfejsu API, organizacji lub środowiska.
  2. Ponownie wdróż serwer proxy interfejsu API.

Przyczyna: brak pliku zajęć

Diagnostyka

  1. Sprawdź, czy konkretny plik klasy Java (zidentyfikowany w kroku 1 powyżej) jest częścią pliku JAR określonego w atrybucie >ResourceURL< lub któregoś z zależnych plików JAR.
  2. Jeśli plik zajęć nie istnieje w żadnym z plików JAR, udało się ustalić przyczynę błędu. Przejdź do Rozwiązanie.
  3. Jeśli plik klasy znajduje się w jednym z plików JAR określonych w zasadzie JavaCallout, musi występować problem z kodem Java lub klasą zależną, który prowadzi do tego błędu. a. Jeśli jesteś użytkownikiem chmury publicznej, skontaktuj się z zespołem pomocy Apigee. b. Jeśli korzystasz z prywatnej chmury, przejdź do sekcji Przyczyna: problem z kodem Java.

Rozdzielczość

  1. Utwórz ponownie plik JAR z brakującymi plikami klas i prześlij plik JAR na odpowiedni poziom (serwer proxy interfejsu API, organizacji lub środowiska).
  2. Ponownie wdróż serwer proxy interfejsu API.

Przyczyna: problem z kodem Java

Kroki diagnostyczne tylko dla użytkowników Private Cloud

Diagnostyka

  1. Sprawdź dzienniki procesora wiadomości (/opt/apigee/var/log/edge-message-processor/system.log i /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Możesz zauważyć wyjątek podobny do przykładu poniżej:

    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. Przeczytaj uważnie ten wyjątek, aby poznać przyczynę niepowodzenia. Zazwyczaj może to oznaczać problem w kodzie Java.

Rozdzielczość

  1. W zależności od przyczyny awarii może być konieczne naprawienie błędu w kodzie Java.
  2. Utwórz ponownie plik JAR z brakującymi plikami klas i prześlij plik JAR na odpowiedni poziom (serwer proxy interfejsu API, organizacji lub środowiska).
  3. Ponownie wdróż serwer proxy interfejsu API.

Prześlij plik JAR

Sprawdź, czy element zasobu ze wszystkimi niezbędnymi klasami istnieje na poziomie serwera proxy interfejsu API, środowiska lub organizacji. Więcej informacji znajdziesz w artykule Pliki zasobów.

  1. Aby przesłać zasób na poziomie serwera proxy interfejsu API, kliknij + (znak plusa) na karcie Zasoby, a następnie wybierz Importuj plik i prześlij plik z komputera lokalnego. Nazwa pliku powinna pasować do elementu >ResourceURL<, ale bez prefiksu java://.

  2. Jeśli chcesz, aby zasób był dostępny dla więcej niż 1 serwera proxy interfejsu API w tym samym środowisku, prześlij go do środowiska. Musisz użyć interfejsu Edge API zgodnie z opisem w sekcji Pliki zasobów.

    Na przykład wpisz następujące wywołanie interfejsu API z komputera lokalnego, aby przesłać określony plik na poziomie środowiska:

    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"
    

    Wyślij wywołanie interfejsu API z tego samego katalogu co plik.

  3. Aby udostępnić plik dla wszystkich serwerów proxy interfejsów API we wszystkich środowiskach w organizacji, możesz pominąć szczegóły środowiska w ścieżce bazowej. Na przykład:

    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"