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)
.NET CORE Installer à partir de ↓. https://www.microsoft.com/net/learn/get-started/windows node.js
Sélectionnez «Windows Installer (.msi)». https://nodejs.org/en/download/
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 azure-functions-core-tools@core
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
À 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
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>
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'
Je vais enfin le déployer.
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": "xxxx@xxxxxxxxxxxxxxxxxxxxxx",
"type": "user"
}
}
]
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.
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é!
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);
}
}
}
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.
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é.
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é!
J'aimerais essayer différentes choses, mais pour le moment, c'est tout.
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.
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