maven模块拆分
maven目录层级
1.所有的aop都拆分到一个新的maven模块中来
1.1 maven模块
1.2 切面定义
package org.apache.dolphinscheduler.aop;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Collections;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Aspect
public class YarnClientAspect {
/**
* The current application report when application submitted successfully
*/
private ApplicationReport currentApplicationReport = null;
private final String appInfoFilePath;
protected final Logger logger = LoggerFactory.getLogger(getClass());
public YarnClientAspect() {
appInfoFilePath = String.format("%s/%s", System.getProperty("user.dir"), "appInfo.log");
}
/**
* Trigger submitApplication when invoking YarnClientImpl.submitApplication
*
* @param appContext application context when invoking YarnClientImpl.submitApplication
* @param submittedAppId the submitted application id returned by YarnClientImpl.submitApplication
* @throws Throwable exceptions
*/
@AfterReturning(pointcut = "execution(ApplicationId org.apache.hadoop.yarn.client.api.impl.YarnClientImpl." +
"submitApplication(ApplicationSubmissionContext)) && args(appContext)", returning = "submittedAppId", argNames = "appContext,submittedAppId")
public void registerApplicationInfo(ApplicationSubmissionContext appContext, ApplicationId submittedAppId) {
if (appInfoFilePath != null) {
try {
Files.write(Paths.get(appInfoFilePath),
Collections.singletonList(submittedAppId.toString()),
StandardOpenOption.CREATE,
StandardOpenOption.WRITE,
StandardOpenOption.APPEND);
} catch (IOException ioException) {
logger.error(
"YarnClientAspect[registerAppInfo]: can't output current application information, because {}",
ioException.getMessage());
}
}
logger.info("YarnClientAspect[submitApplication]: current application context {}", appContext);
logger.info("YarnClientAspect[submitApplication]: submitted application id {}", submittedAppId);
logger.info(
"YarnClientAspect[submitApplication]: current application report {}", currentApplicationReport);
}
/**
* Trigger getAppReport only when invoking getApplicationReport within submitApplication
* This method will invoke many times, however, the last ApplicationReport instance assigned to currentApplicationReport
*
* @param appReport current application report when invoking getApplicationReport within submitApplication
* @param appId current application id, which is the parameter of getApplicationReport
*/
@AfterReturning(pointcut = "cflow(execution(ApplicationId org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.submitApplication(ApplicationSubmissionContext))) "
+
"&& !within(YarnClientAspect) && execution(ApplicationReport org.apache.hadoop.yarn.client.api.impl.YarnClientImpl.getApplicationReport(ApplicationId)) && args(appId)", returning = "appReport", argNames = "appReport,appId")
public void registerApplicationReport(ApplicationReport appReport, ApplicationId appId) {
currentApplicationReport = appReport;
}
}
1.3 pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.dolphinscheduler</groupId>
<artifactId>dolphinscheduler</artifactId>
<version>dev-SNAPSHOT</version>
</parent>
<artifactId>dolphinscheduler-aop</artifactId>
<packaging>jar</packaging>
<name>${project.artifactId}</name>
<description>aop 4 YarnClient to get application id when submitting jars using 'yarn jar mainClass args'</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dolphinscheduler</groupId>
<artifactId>dolphinscheduler-bom</artifactId>
<version>${project.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-yarn-client</artifactId>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
原创:做时间的朋友