Fonctions Azure en Java

Aperçu

Il semble que java soit officiellement pris en charge par les fonctions azure, alors essayons-le pendant un moment. En gros, cela a été fait selon le flux suivant, mais j'ai trébuché plusieurs fois en cours de route, alors notez le contenu de la trébuchement. Créez votre première fonction en utilisant Java et Maven (aperçu)

environnement

Tout d'abord, diverses installations

.NET CORE Installer à partir de ↓. https://www.microsoft.com/net/learn/get-started/windows node.js

installateur

Sélectionnez «Windows Installer (.msi)». https://nodejs.org/en/download/

Vérification

Après l'installation, le chemin est déjà en place. Vérifions à l'invite de commande.

> node -v
v8.9.4

Azure Functions Core Tools Un outil qui vous permet d'exécuter et de déboguer des fonctions Azure localement. Maintenant que node.js est installé, installez-le en utilisant npm.

>npm install -g [email protected]
C:\Users\xxx\AppData\Roaming\npm\func -> C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools\lib\main.js
C:\Users\xxx\AppData\Roaming\npm\azurefunctions -> C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools\lib\main.js
C:\Users\xxx\AppData\Roaming\npm\azfun -> C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools\lib\main.js

[email protected] postinstall C:\Users\xxx\AppData\Roaming\npm\node_modules\azure-functions-core-tools
node lib/install.js

[==================] Downloading Azure Functions Cli
+ [email protected]
added 46 packages in 8.164s

Azure CLI Comme son nom l'indique, c'est un outil qui vous permet d'utiliser Azure en ligne de commande. Installez en vous référant à ce qui suit. https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows

Créer un projet

À l'invite de commandes, accédez à l'espace de travail d'Eclipse et exécutez la commande suivante. Je pense que vous pouvez créer un nouveau projet avec l'interface graphique.

mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype

Il vous sera demandé différents groupIds, alors donnez-lui un nom que vous aimez.

Define value for property 'groupId': jp.suzuq
Define value for property 'artifactId': azure.functions
Define value for property 'version' 1.0-SNAPSHOT: : 0.0.1
Define value for property 'package' jp.suzuq: : jp.suzuq.azure.functions
Define value for property 'appName' azure.functions-20180222185249620: :
Define value for property 'appRegion' westus: : jp

Construisez immédiatement

Lorsque le projet est terminé, une classe de fonctions simple est créée. Tout d'abord, construisons et déployons ceci et vérifions le fonctionnement.

mvn clean package

Si je l'ai fait tel quel, la construction a échoué avec l'erreur suivante.

Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.1.10:package (package-functions) on project azure.functions: Execution package-functions of goal com.microsoft.azure:azure-functions-maven-plugin:0.1.10:package failed: A required class was missing while executing com.microsoft.azure:azure-functions-maven-plugin:0.1.10: package: com/microsoft/azure/serverless/functions/annotation/DocumentDBInput

Le plugin azure-functions-maven-plugin semble être quelque chose de mal, j'ai donc changé la version pour la dernière version 0.2.1 et cela a fonctionné.

pom.xml


                <plugin>
                    <groupId>com.microsoft.azure</groupId>
                    <artifactId>azure-functions-maven-plugin</artifactId>
                    <version>0.2.1</version>
                </plugin>

Test exécuté localement

Avant de déployer sur Azure, essayez de l'exécuter localement.

mvn azure-functions:run

Le logo des fonctions s'affiche sur la console ...

[INFO] Starting running Azure Functions...

                  %%%%%%
                 %%%%%%
            @   %%%%%%    @
          @@   %%%%%%      @@
       @@@    %%%%%%%%%%%    @@@
     @@      %%%%%%%%%%        @@
       @@         %%%%       @@
         @@      %%%       @@
           @@    %%      @@
                %%
                %

Lorsque le message suivant apparaît, vous êtes prêt à partir.

Http Functions:

	hello: http://localhost:7071/api/hello

Comme indiqué, essayez ce qui suit dans curl: Si vous n'avez pas curl, utilisez un outil qui peut lancer quelque chose http.

curl -w '\n' -d hoge http://localhost:7071/api/hello

Le journal est sorti sur la console et vous pouvez voir qu'il est en cours d'exécution.

[2018/05/02 9:51:28] Function started (Id=0aed5288-e5ff-47e2-868b-8455d7731b70)
[2018/05/02 9:51:28] Executing 'Functions.hello' (Reason='This function was programmatically called via the host APIs.', Id=0aed5288-e5ff-47e2-868b-8455d7731b70)
[2018/05/02 9:51:28] Java HTTP trigger processed a request.
[2018/05/02 9:51:28] Function "hello" (ID: 40832889-9057-4664-885e-c84407660a4a) invoked by Java Worker
[2018/05/02 9:51:28] Function completed (Success, Id=0aed5288-e5ff-47e2-868b-8455d7731b70, Duration=5ms)
[2018/05/02 9:51:28] Executed 'Functions.hello' (Succeeded, Id=0aed5288-e5ff-47e2-868b-8455d7731b70)

Le résultat de l'exécution a été renvoyé avec la 200e réponse.

Hello, hoge'

Déployer

Je vais enfin le déployer.

Connectez-vous à Azure

Connectez-vous à l'aide de l'interface de ligne de commande azure. Ouvrez le PowerShell sur votre PC et "az login".

> az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXX to authenticate.

Comme indiqué, accédez à https://microsoft.com/devicelogin et entrez le code affiché sur la console PowerShell. La commande "az login" se ferme et affiche les informations sur l'azur auquel vous vous êtes connecté.

[
  {
    "cloudName": "AzureCloud",
    "id": "xxxxxxxxxxxxxxxxxxxxxxx",
    "isDefault": true,
    "name": "Microsoft Azure",
    "state": "Enabled",
    "tenantId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "user": {
      "name": "[email protected]",
      "type": "user"
    }
  }
]

Déployer avec maven

Revenez à eclipse et exécutez la commande maven ci-dessous.

mvn azure-functions:deploy

J'ai une erreur ...

[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.2.1:deploy (default-cli) on project azure.functions: Status code 400, {"error":{"code":"LocationNotAvailableForResourceGroup","message":"The provided location 'jp' is not available for resource group. List of available regions is 'centralus,eastasia,southeastasia,eastus,eastus2,westus,westus2,northcentralus,southcentralus,westcentralus,northeurope,westeurope,japaneast,japanwest,brazilsouth,australiasoutheast,australiaeast,westindia,southindia,centralindia,canadacentral,canadaeast,uksouth,ukwest,koreacentral,koreasouth,francecentral'."}}

Puisque region dit ceci, essayez de changer le paramètre de type region de pom.xml de "jp" à "japaneast".

pom.xml


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <functionAppName>azure.functions-9999999.azurewebsites.net</functionAppName>
        <functionAppRegion>japaneast</functionAppRegion>
    </properties>

Cette fois, j'ai eu une erreur différente.

[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.2.1:deploy (default-cli) on project azure.functions: The host name azure.functions-20180222185249620.azurewebsites.net is invalid. OnError while emitting onNext value: retrofit2.Response.class

Essayez de changer le nom de la fonction. Le nom de la fonction sera également le nom de fichier du fichier jar qui sera déployé sur azure, alors créez-le à nouveau ici.

pom.xml


    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <functionAppName>testFunction</functionAppName>
        <functionAppRegion>japaneast</functionAppRegion>
    </properties>

Aussi une erreur.

[ERROR] Failed to execute goal com.microsoft.azure:azure-functions-maven-plugin:0.2.1:deploy (default-cli) on project azure.functions: {
[ERROR] "message": "An error has occurred.",
[ERROR] "exceptionMessage": "An error occurred when trying to create a controller of type 'DeploymentController'. Make sure that the controller has a parameterless public constructor.",
[ERROR] "exceptionType": "System.InvalidOperationException",
[ERROR] "stackTrace": "   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
[ERROR] "innerException": {
[ERROR] "message": "An error has occurred.",
[ERROR] "exceptionMessage": "The user name or password is incorrect.\r\n",
[ERROR] "exceptionType": "System.IO.IOException",
[ERROR] "stackTrace": "   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)\r\n   at System.IO.Directory.InternalCreateDirectory(String fullPath, String path, Object dirSecurityObj, Boolean checkHost)\r\n   at System.IO.Directory.InternalCreateDirectoryHelper(String path, Boolean checkHost)\r\n   at System.IO.Directory.CreateDirectory(String path)\r\n   at System.IO.Abstractions.DirectoryWrapper.CreateDirectory(String path)\r\n   at Microsoft.Web.Deployment.WebApi.PathHelper.GetLogFilesFolderPath(IEnvironment environment)\r\n   at Microsoft.Web.Deployment.WebApi.DeploymentController..ctor()\r\n   at lambda_method(Closure )\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
[ERROR] }
[ERROR] }: OnError while emitting onNext value: retrofit2.Response.class

Je ne sais pas ce que vous dites, alors j'ai essayé à nouveau et pour une raison quelconque, SUCCESS.

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 35.832 s
[INFO] Finished at: 2018-05-10T18:55:38+09:00
[INFO] Final Memory: 48M/551M
[INFO] ------------------------------------------------------------------------

Vérifions la fonction déployée dans le portail Azure. Depuis "Function App" dans le menu latéral.

azurePortal.png

Essayez de courir

Vous pouvez copier l'URL depuis "Obtenir l'URL de la fonction" en haut à droite de l'image ci-dessus. Faisons une requête de curl à l'URL copiée.

curl -w '\n' https://functionName.azurewebsites.net/api/hello -d AzureFunctions
Hello, AzureFunctions

Ça a marché!

Créer une fonction originale

Pour le moment, la fonction préparée par défaut a fonctionné, alors faisons-en une originale. Je viens d'exécuter ce programme qui a été généré automatiquement dans l'espace de travail. Avec ceci comme référence, je vais créer ma propre fonction.

Function.java


package jp.suzuq.azure.functions;

import java.util.*;
import com.microsoft.azure.serverless.functions.annotation.*;
import com.microsoft.azure.serverless.functions.*;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/hello". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/hello
     * 2. curl {your host}/api/hello?name=HTTP%20Query
     */
    @FunctionName("hello")
    public HttpResponseMessage<String> hello(
            @HttpTrigger(name = "req", methods = {"get", "post"}, authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        String query = request.getQueryParameters().get("name");
        String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponse(400, "Please pass a name on the query string or in the request body");
        } else {
            return request.createResponse(200, "Hello, " + name);
        }
    }
}

Faire un déclencheur de minuterie

La valeur par défaut est une fonction qui est déclenchée par une requête http, alors créons une fonction qui est déclenchée par un minuteur.

TimerFunction.java


package jp.suzuq.azure.functions;

import com.microsoft.azure.serverless.functions.ExecutionContext;
import com.microsoft.azure.serverless.functions.annotation.FunctionName;
import com.microsoft.azure.serverless.functions.annotation.TimerTrigger;

public class TimerFunction {
    @FunctionName("timer")
    public void timer(
            @TimerTrigger(name = "timer", schedule = "0 */5 * * * *") String timerInfo,
            final ExecutionContext context) 
    {
        context.getLogger().info("timerInfo : " + timerInfo);

    }
}

Ajoutez l'annotation @TimerTrigger au premier argument de la méthode. Ensuite, décrivez le planning au format cron dans "planning". Il s'agit du calendrier d'exécution de la fonction.

Ajouter une bibliothèque

Je voulais faire des fonctions Azure avec java, car je voulais utiliser différentes bibliothèques java. Il y a beaucoup de classes java utiles dans le référentiel maven interne, et je les utilise dans mon développement quotidien, donc j'ai pensé que ce serait bien si je pouvais les utiliser également dans les fonctions Azure.

Ajoutez-le à pom.xml et essayez de le déployer.

pom.xml


		<dependency>
			<groupId>jp.hoge</groupId>
			<artifactId>HogeCommon</artifactId>
			<version>1.20.0</version>
		</dependency>

Lorsque j'essaie de le déplacer, la fonction expire pour une raison quelconque et elle se termine de force au milieu. Je me demandais pourquoi il a expiré, mais après tout, il semble que la bibliothèque que j'ai ajoutée à pom n'a pas été incluse dans le module intégré. Ensuite, lancez une ClassNotFoundException ...

Les modules prédéfinis peuvent être téléchargés dans Kudu à partir du portail Azure si vous souhaitez voir le dossier cible dans l'espace de travail eclipse ou ce qui a été réellement déployé.

スケッチ.png

スケッチ2.png

Comme la méthode de construction était mauvaise, j'ai modifié pom.xml en faisant référence à ce qui suit. How to add dependency JAR in java azure functions

pom.xml


			<plugin>
			   <groupId>org.apache.maven.plugins</groupId>
			   <artifactId>maven-assembly-plugin</artifactId>
			   <configuration>
			      <appendAssemblyId>false</appendAssemblyId>
			      <descriptorRefs>
			         <descriptorRef>jar-with-dependencies</descriptorRef>
			      </descriptorRefs>
			      <archive />
			   </configuration>
			   <executions>
			      <execution>
			         <id>make-assembly</id>
			         <phase>package</phase>
			         <goals>
			            <goal>single</goal>
			         </goals>
			      </execution>
			   </executions>
			</plugin>

Wow, ça a marché! 1528452015300.png

J'aimerais essayer différentes choses, mais pour le moment, c'est tout.

Impressions

Je suis heureux de pouvoir utiliser la bibliothèque interne avec Azure Functions. Mais après tout, il est difficile de préparer diverses choses. Si c'est une fonction simple, il est plus facile de la faire avec javascript. C'est bien que java puisse réutiliser les actifs existants dans l'entreprise comme cette fois et puisse déboguer localement. Je voudrais l'utiliser correctement selon le but.

Site utile

Créez votre première fonction en utilisant Java et Maven (aperçu) Définir le déclencheur en java Installation et connexion à Azure CLI (version Windows) How to add dependency JAR in java azure functions

Recommended Posts

Fonctions Azure en Java
Créer des fonctions Azure en Java
Résolution du problème lorsque Azure Functions a cessé de fonctionner en Java
Exécuter des applications Java dans Azure Batch
Partition en Java
Changements dans Java 11
Janken à Java
Taux circonférentiel à Java
FizzBuzz en Java
Lire JSON en Java
Implémentation de l'interpréteur par Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Interface appelable en Java
Commentaires dans la source Java
Formater XML en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Hello World en Java
Utiliser OpenCV avec Java
Mémorandum WebApi avec Java
Détermination de type en Java
Exécuter des commandes en Java (ping)
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Exprimer l'échec en Java
Créer JSON en Java
Manipulation de la date dans Java 8
Nouveautés de Java 8
Utiliser PreparedStatement en Java
Nouveautés de Java 9,10,11
Exécution parallèle en Java
Comment appeler des fonctions en bloc avec la réflexion Java
Tout supprimer du SDK Java dans Azure CosmosDB
Modifier la taille du tas Java dans Tomcat d'Azure App Service
Android-Télécharger des fichiers image vers Azure Blob Storage en Java
Débogage à distance des applications Java dans Azure Web Apps
Lire des fichiers binaires en Java 1
Évitez l'erreur que Yuma a donnée en Java
[Neta] Sleep Sort en Java
Modifier ini en Java: ini4j
L'histoire de Java dans ce monde
Segfo Java en 6 lignes
Essayez d'appeler JavaScript en Java
Essayez de développer Spresense avec Java (1)
J'ai fait une roulette à Java.
Implémentation de l'authentification en deux étapes en Java
Refactoring: faire du Blackjack en Java
Ecrire des rappels de vol en Java
Analyse de sujets (LDA) en Java