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

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

ResourceDoesNotExist

Komunikat o błędzie

Wdrażanie serwera proxy interfejsu API za pomocą interfejsu Edge UI lub interfejsu Edge Management API kończy się niepowodzeniem i wyświetla 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.

Przykładowy zrzut ekranu z błędem

Przyczyna

Jeśli zasób określony w elemencie <ResourceURL> w zasadach JavaCallout nie istnieje na poziomie serwera proxy interfejsu API, środowiska lub organizacji, wdrożenie serwera proxy interfejsu API nie powiedzie się.

Diagnostyka

  1. Określ środowisko i nazwę zasobu. Te informacje znajdziesz w komunikacie o błędzie. Na przykład w tym błędzie środowisko to test, a nazwa zasobu użyta 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 używa zasobu zidentyfikowanego w kroku 1 powyżej.

    Na przykład te zasady określają wartość <ResourceURL> jako myresource.jar, co odpowiada wartości w komunikacie 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 jest częścią działającego nieprawidłowo proxy interfejsu API, czy został przesłany na poziomie środowiska lub organizacji. Jeśli nie, to jest to przyczyna błędu.

    • Aby wyświetlić wszystkie zasoby przesłane na poziomie proxy interfejsu API, przejdź na kartę Zasoby w okienku Nawigator edytora proxy interfejsu API. W tym przykładzie proxy interfejsu API nie ma przesłanych 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, wyślij 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, wywołaj to wywołanie interfejsu API za pomocą polecenia curl, pomijając szczegóły środowiska:curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Jeśli w odpowiedzi na te interfejsy API otrzymasz kod stanu 404, oznacza to, że zasób nie występuje na poziomie organizacji ani środowiska.

    Jeśli zasób nie jest dostępny na poziomie proxy interfejsu API, organizacji i środowiska, zwracany jest błąd wdrażania:

    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ć pokazane powyżej zasady JavaCallout, prześlij plik JAR na odpowiednim poziomie (proxy interfejsu API, organizacji lub środowiska).

NoResourceForURL

Komunikat o błędzie

Wdrażanie serwera proxy interfejsu API za pomocą interfejsu Edge UI lub interfejsu Edge Management API kończy się niepowodzeniem i wyświetla 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

Przykładowy zrzut ekranu z błędem

Przyczyna

Ten błąd może wystąpić, jeśli plik zasobu jest uszkodzony lub został przesłany tylko częściowo, mimo że wydaje się istnieć na poziomie proxy interfejsu API, środowiska lub organizacji.

Diagnostyka

  1. Określ środowisko i nazwę zasobu. Te informacje znajdziesz w komunikacie o błędzie. Na przykład w tym błędzie nazwa środowiska to test, a nazwa zasobu użyta 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 przykładzie poniżej widać, że zasób myresource.jar jest przesył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, wyślij 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, wywołaj ten interfejs API za pomocą polecenia curl, pomijając szczegóły środowiska:curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Jeśli w odpowiedzi na te interfejsy API otrzymasz kod stanu 404, oznacza to, że zasób nie występuje na poziomie organizacji ani środowiska.

Rozdzielczość

  1. Jeśli stwierdzisz, że zasób istnieje na poziomie serwera proxy interfejsu API, organizacji lub środowiska, usuń go i ponownie prześlij zgodnie z opisem w kroku 2. W innym przypadku przejdź do kroku 3.
  2. Aby usunąć zasób na poziomie serwera proxy interfejsu API, w panelu nawigacji edytora serwera proxy interfejsu API otwórz kartę Zasoby 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 były wcześniej używane w krokach diagnostycznych. 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 (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 problem. Jeśli korzystasz z Apigee Edge w chmurze, skontaktuj się z zespołem pomocy Apigee. Jeśli korzystasz z chmury prywatnej, zapoznaj się z artykułem Uruchamianie, zatrzymywanie, ponowne uruchamianie i sprawdzanie stanu Apigee Edge.

JavaCalloutInstantiationFailed

Komunikat o błędzie

Wdrażanie serwera proxy interfejsu API za pomocą interfejsu Edge UI lub interfejsu Edge Management API kończy się niepowodzeniem i wyświetla 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

Przykładowy zrzut ekranu z błędem

Przyczyna

Typowe przyczyny tego błędu

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

Typowy etap diagnostyki

  1. Określ nazwę środowiska i klasę, której nie udało się zaimportować. Na przykład w tym komunikacie o błędzie nazwa środowiska 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ę (zidentyfikowaną w kroku 1 powyżej) i którego nie można było 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 żadnym z poziomów, przejdź do sekcji Rozwiązanie.
  3. Jeśli plik JAR został przesłany, przejdź do sekcji Przyczyna: uszkodzony plik JAR.

Rozdzielczość

  1. Jeśli plik JAR jest uszkodzony lub został przesłany tylko częściowo, ponownie go skompiluj i prześlij na odpowiednim poziomie (proxy interfejsu API, organizacji lub środowiska).
  2. Wdróż ponownie proxy interfejsu API.

Przyczyna: uszkodzony plik JAR

Diagnostyka

  1. Określ plik JAR, który powinien zawierać klasę (zidentyfikowaną w kroku 1 powyżej), której nie można było utworzyć.
  2. Sprawdź, czy dany plik JAR nie jest uszkodzony. Na przykład jeśli nie możesz rozpakować pliku, ponieważ jest on uszkodzony lub został przesłany tylko częściowo. Jeśli jest uszkodzony, przejdź do sekcji Rozdzielczość.
  3. Jeśli plik JAR nie jest uszkodzony, przejdź do sekcji Przyczyna: brak pliku klasy.

Rozdzielczość

  1. Ponownie utwórz uszkodzone pliki JAR i prześlij je na odpowiednim poziomie (proxy interfejsu API, organizacji lub środowiska).
  2. Wdróż ponownie proxy interfejsu API.

Przyczyna: brak pliku klasy

Diagnostyka

  1. Sprawdź, czy konkretny plik klasy Java (zidentyfikowany w kroku 1 powyżej) jest częścią pliku JAR określonego w elemencie >ResourceURL< lub dowolnego z zależnych plików JAR.
  2. Jeśli plik klasy nie istnieje w żadnym z plików JAR, oznacza to, że udało Ci się ustalić przyczynę błędu. Przejdź do sekcji Rozdzielczość.
  3. Jeśli plik klasy istnieje w jednym z plików JAR określonych w zasadach JavaCallout, musi występować problem z kodem Java lub zależną klasą, który powoduje ten błąd. a. Jeśli korzystasz z chmury publicznej, skontaktuj się z zespołem pomocy Apigee. b. Jeśli korzystasz z chmury prywatnej, przejdź do sekcji Przyczyna: problem z kodem Java.

Rozdzielczość

  1. Odbuduj plik JAR z brakującymi plikami klas i prześlij go na odpowiednim poziomie (proxy interfejsu API, organizacji lub środowiska).
  2. Wdróż ponownie serwer proxy interfejsu API.

Przyczyna: problem z kodem Java

Kroki diagnostyczne tylko dla użytkowników chmury prywatnej

Diagnostyka

  1. Sprawdź dzienniki procesora komunikatów (/opt/apigee/var/log/edge-message-processor/system.log i /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Może pojawić się wyjątek podobny do tego 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. Uważnie przeczytaj wyjątek, aby poznać przyczynę niepowodzenia. Zwykle wskazuje to na problem w kodzie Java.

Rozdzielczość

  1. W zależności od przyczyny niepowodzenia może być konieczne naprawienie problemu w kodzie Java.
  2. Odbuduj plik JAR z brakującymi plikami klas i prześlij go na odpowiednim poziomie (proxy interfejsu API, organizacji lub środowiska).
  3. Wdróż ponownie serwer proxy interfejsu API.

Przesyłanie pliku JAR

Sprawdź, czy element zasobu ze wszystkimi niezbędnymi klasami istnieje na poziomie serwera proxy 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 być zgodna z elementem >ResourceURL<, ale bez prefiksu java://.

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

    Na przykład wpisz to wywołanie interfejsu API na komputerze lokalnym, 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"
    

    Wywołaj interfejs API z tego samego katalogu co plik.

  3. Aby udostępnić plik wszystkim serwerom proxy interfejsu API we wszystkich środowiskach w organizacji, możesz pominąć szczegóły środowiska w ścieżce podstawowej. 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"