commit
57cf573756
30 changed files with 2695 additions and 0 deletions
-
40.classpath
-
3.gitignore
-
23.project
-
5.settings/org.eclipse.core.resources.prefs
-
9.settings/org.eclipse.jdt.core.prefs
-
4.settings/org.eclipse.m2e.core.prefs
-
265pom.xml
-
22src/main/java/com/bw/asr/Application.java
-
36src/main/java/com/bw/asr/cache/ConfigCache.java
-
39src/main/java/com/bw/asr/controller/TaskReceiveController.java
-
177src/main/java/com/bw/asr/entity/Constants.java
-
222src/main/java/com/bw/asr/handler/MainHandler.java
-
24src/main/java/com/bw/asr/service/AsrTaskService.java
-
17src/main/java/com/bw/asr/service/TaskReceiveService.java
-
166src/main/java/com/bw/asr/service/impl/AsrTaskServiceImpl.java
-
55src/main/java/com/bw/asr/service/impl/TaskReceiveServiceImpl.java
-
48src/main/java/com/bw/asr/utils/DataUtil.java
-
177src/main/java/com/bw/asr/utils/DateUtil.java
-
915src/main/java/com/bw/asr/utils/DownLoadUtil.java
-
27src/main/java/com/bw/asr/utils/EncryptionUtil.java
-
36src/main/java/com/bw/asr/utils/FileUtil.java
-
53src/main/java/com/bw/asr/utils/GPTResultParseUtil.java
-
32src/main/java/com/bw/asr/utils/JsonUtil.java
-
33src/main/java/com/bw/asr/utils/OtherUtils.java
-
18src/main/java/com/bw/asr/utils/QueueUtil.java
-
46src/main/java/com/bw/asr/utils/SpringBootKafka.java
-
23src/main/java/com/bw/asr/utils/ThrowMessageUtil.java
-
106src/main/resources/application.yml
-
36src/main/resources/logback-spring.xml
-
38src/test/java/com/bw/AppTest.java
@ -0,0 +1,40 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<classpath> |
|||
<classpathentry kind="src" output="target/classes" path="src/main/java"> |
|||
<attributes> |
|||
<attribute name="optional" value="true"/> |
|||
<attribute name="maven.pomderived" value="true"/> |
|||
</attributes> |
|||
</classpathentry> |
|||
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> |
|||
<attributes> |
|||
<attribute name="maven.pomderived" value="true"/> |
|||
<attribute name="optional" value="true"/> |
|||
</attributes> |
|||
</classpathentry> |
|||
<classpathentry kind="src" output="target/test-classes" path="src/test/java"> |
|||
<attributes> |
|||
<attribute name="optional" value="true"/> |
|||
<attribute name="maven.pomderived" value="true"/> |
|||
<attribute name="test" value="true"/> |
|||
</attributes> |
|||
</classpathentry> |
|||
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> |
|||
<attributes> |
|||
<attribute name="maven.pomderived" value="true"/> |
|||
<attribute name="test" value="true"/> |
|||
<attribute name="optional" value="true"/> |
|||
</attributes> |
|||
</classpathentry> |
|||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"> |
|||
<attributes> |
|||
<attribute name="maven.pomderived" value="true"/> |
|||
</attributes> |
|||
</classpathentry> |
|||
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> |
|||
<attributes> |
|||
<attribute name="maven.pomderived" value="true"/> |
|||
</attributes> |
|||
</classpathentry> |
|||
<classpathentry kind="output" path="target/classes"/> |
|||
</classpath> |
@ -0,0 +1,3 @@ |
|||
/target/ |
|||
/logs/ |
|||
/target/ |
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<projectDescription> |
|||
<name>baidu_asr</name> |
|||
<comment></comment> |
|||
<projects> |
|||
</projects> |
|||
<buildSpec> |
|||
<buildCommand> |
|||
<name>org.eclipse.jdt.core.javabuilder</name> |
|||
<arguments> |
|||
</arguments> |
|||
</buildCommand> |
|||
<buildCommand> |
|||
<name>org.eclipse.m2e.core.maven2Builder</name> |
|||
<arguments> |
|||
</arguments> |
|||
</buildCommand> |
|||
</buildSpec> |
|||
<natures> |
|||
<nature>org.eclipse.jdt.core.javanature</nature> |
|||
<nature>org.eclipse.m2e.core.maven2Nature</nature> |
|||
</natures> |
|||
</projectDescription> |
@ -0,0 +1,5 @@ |
|||
eclipse.preferences.version=1 |
|||
encoding//src/main/java=UTF-8 |
|||
encoding//src/main/resources=UTF-8 |
|||
encoding//src/test/java=UTF-8 |
|||
encoding/<project>=UTF-8 |
@ -0,0 +1,9 @@ |
|||
eclipse.preferences.version=1 |
|||
org.eclipse.jdt.core.compiler.codegen.methodParameters=generate |
|||
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 |
|||
org.eclipse.jdt.core.compiler.compliance=1.8 |
|||
org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled |
|||
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning |
|||
org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore |
|||
org.eclipse.jdt.core.compiler.release=disabled |
|||
org.eclipse.jdt.core.compiler.source=1.8 |
@ -0,0 +1,4 @@ |
|||
activeProfiles= |
|||
eclipse.preferences.version=1 |
|||
resolveWorkspaceProjects=true |
|||
version=1 |
@ -0,0 +1,265 @@ |
|||
<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.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-parent</artifactId> |
|||
<version>2.2.4.RELEASE</version> |
|||
</parent> |
|||
<groupId>com.bw</groupId> |
|||
<artifactId>baidu_asr</artifactId> |
|||
<version>0.0.1-SNAPSHOT</version> |
|||
<packaging>jar</packaging> |
|||
|
|||
<name>baidu_asr</name> |
|||
<url>http://maven.apache.org</url> |
|||
|
|||
<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> |
|||
</properties> |
|||
|
|||
<dependencies> |
|||
<dependency> |
|||
<groupId>junit</groupId> |
|||
<artifactId>junit</artifactId> |
|||
<version>4.11</version> |
|||
<scope>test</scope> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-starter-web</artifactId> |
|||
</dependency> |
|||
<!-- |
|||
https://mvnrepository.com/artifact/de.codecentric/spring-boot-admin-starter-client --> |
|||
<dependency> |
|||
<groupId>de.codecentric</groupId> |
|||
<artifactId>spring-boot-admin-starter-client</artifactId> |
|||
<version>2.2.4</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>com.google.code.gson</groupId> |
|||
<artifactId>gson</artifactId> |
|||
<version>2.8.8</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-test</artifactId> |
|||
</dependency> |
|||
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test --> |
|||
<dependency> |
|||
<groupId>org.springframework</groupId> |
|||
<artifactId>spring-test</artifactId> |
|||
<version>5.0.10.RELEASE</version> |
|||
<scope>test</scope> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>commons-io</groupId> |
|||
<artifactId>commons-io</artifactId> |
|||
<version>1.4</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>com.alibaba</groupId> |
|||
<artifactId>fastjson</artifactId> |
|||
<version>2.0.17</version> |
|||
</dependency> |
|||
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 --> |
|||
<dependency> |
|||
<groupId>com.mchange</groupId> |
|||
<artifactId>c3p0</artifactId> |
|||
<version>0.9.5.5</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>mysql</groupId> |
|||
<artifactId>mysql-connector-java</artifactId> |
|||
<version>8.0.29</version> |
|||
</dependency> |
|||
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> |
|||
<dependency> |
|||
<groupId>com.squareup.okhttp3</groupId> |
|||
<artifactId>okhttp</artifactId> |
|||
<version>4.9.3</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.apache.httpcomponents</groupId> |
|||
<artifactId>httpclient</artifactId> |
|||
<version>4.5.3</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>commons-lang</groupId> |
|||
<artifactId>commons-lang</artifactId> |
|||
<version>2.6</version> |
|||
</dependency> |
|||
<!-- |
|||
https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-reflect --> |
|||
<dependency> |
|||
<groupId>org.jetbrains.kotlin</groupId> |
|||
<artifactId>kotlin-reflect</artifactId> |
|||
<version>1.6.21</version> |
|||
<scope>runtime</scope> |
|||
</dependency> |
|||
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup --> |
|||
<dependency> |
|||
<groupId>org.jsoup</groupId> |
|||
<artifactId>jsoup</artifactId> |
|||
<version>1.8.1</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>org.projectlombok</groupId> |
|||
<artifactId>lombok</artifactId> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.springframework.kafka</groupId> |
|||
<artifactId>spring-kafka</artifactId> |
|||
</dependency> |
|||
|
|||
<!-- <dependency> <groupId>org.springframework.kafka</groupId> |
|||
<artifactId>spring-kafka</artifactId> |
|||
</dependency> --> |
|||
<dependency> |
|||
<groupId>cn.hutool</groupId> |
|||
<artifactId>hutool-all</artifactId> |
|||
<version>5.8.5</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>junit</groupId> |
|||
<artifactId>junit</artifactId> |
|||
</dependency> |
|||
<!-- https://mvnrepository.com/artifact/p6spy/p6spy --> |
|||
<dependency> |
|||
<groupId>p6spy</groupId> |
|||
<artifactId>p6spy</artifactId> |
|||
<version>3.9.0</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>commons-collections</groupId> |
|||
<artifactId>commons-collections</artifactId> |
|||
<version>3.2.2</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.elasticsearch.client</groupId> |
|||
<artifactId>transport</artifactId> |
|||
<version>6.0.0</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>org.elasticsearch</groupId> |
|||
<artifactId>elasticsearch</artifactId> |
|||
<version>6.0.0</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>org.elasticsearch.plugin</groupId> |
|||
<artifactId>transport-netty4-client</artifactId> |
|||
<version>6.0.0</version> |
|||
</dependency> |
|||
|
|||
<dependency> |
|||
<groupId>com.auth0</groupId> |
|||
<artifactId>java-jwt</artifactId> |
|||
<version>4.2.2</version> |
|||
</dependency> |
|||
<dependency> |
|||
<groupId>com.bfd.util</groupId> |
|||
<artifactId>pauseTool</artifactId> |
|||
<version>1.0</version> |
|||
</dependency> |
|||
</dependencies> |
|||
|
|||
<build> |
|||
<!-- <pluginManagement> --><!-- lock down plugins versions to avoid using Maven defaults (may be |
|||
moved |
|||
to parent pom) --> |
|||
<plugins> |
|||
<!-- clean lifecycle, see |
|||
https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle --> |
|||
<plugin> |
|||
<artifactId>maven-clean-plugin</artifactId> |
|||
<version>3.1.0</version> |
|||
</plugin> |
|||
<!-- default lifecycle, jar packaging: see |
|||
https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging --> |
|||
<plugin> |
|||
<artifactId>maven-resources-plugin</artifactId> |
|||
<version>3.0.2</version> |
|||
</plugin> |
|||
<plugin> |
|||
<artifactId>maven-compiler-plugin</artifactId> |
|||
<version>3.8.0</version> |
|||
</plugin> |
|||
<plugin> |
|||
<artifactId>maven-surefire-plugin</artifactId> |
|||
<version>2.22.1</version> |
|||
</plugin> |
|||
<plugin> |
|||
<artifactId>maven-jar-plugin</artifactId> |
|||
<version>3.0.2</version> |
|||
</plugin> |
|||
<plugin> |
|||
<artifactId>maven-install-plugin</artifactId> |
|||
<version>2.5.2</version> |
|||
</plugin> |
|||
<plugin> |
|||
<artifactId>maven-deploy-plugin</artifactId> |
|||
<version>2.8.2</version> |
|||
</plugin> |
|||
<!-- site lifecycle, see |
|||
https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle --> |
|||
<plugin> |
|||
<artifactId>maven-site-plugin</artifactId> |
|||
<version>3.7.1</version> |
|||
</plugin> |
|||
<plugin> |
|||
<artifactId>maven-project-info-reports-plugin</artifactId> |
|||
<version>3.0.0</version> |
|||
</plugin> |
|||
<!-- spring-boot-maven-plugin插件就是打包spring boot应用的 --> |
|||
|
|||
<plugin> |
|||
<groupId>org.springframework.boot</groupId> |
|||
<artifactId>spring-boot-maven-plugin</artifactId> |
|||
<configuration> |
|||
<mainClass>com.bw.asr.Application</mainClass> |
|||
<layout>ZIP</layout> |
|||
<includes> |
|||
<include> |
|||
<groupId>${project.groupId}</groupId> |
|||
<artifactId>${project.artifactId}</artifactId> |
|||
</include> |
|||
</includes> |
|||
</configuration> |
|||
<executions> |
|||
<execution> |
|||
<goals> |
|||
<goal>repackage</goal> |
|||
</goals> |
|||
</execution> |
|||
</executions> |
|||
</plugin> |
|||
<plugin> |
|||
<groupId>org.apache.maven.plugins</groupId> |
|||
<artifactId>maven-dependency-plugin</artifactId> |
|||
<version>3.1.1</version> |
|||
<executions> |
|||
<execution> |
|||
<id>copy</id> |
|||
<phase>package</phase> |
|||
<goals> |
|||
<goal>copy-dependencies</goal> |
|||
</goals> |
|||
<configuration> |
|||
<type>jar</type> |
|||
<includeTypes>jar</includeTypes> |
|||
<includeScope>runtime</includeScope> |
|||
<outputDirectory>${project.build.directory}/libs</outputDirectory> |
|||
</configuration> |
|||
</execution> |
|||
</executions> |
|||
</plugin> |
|||
</plugins> |
|||
<!-- </pluginManagement> --> |
|||
</build> |
|||
</project> |
@ -0,0 +1,22 @@ |
|||
package com.bw.asr; |
|||
|
|||
|
|||
|
|||
import org.springframework.boot.SpringApplication; |
|||
import org.springframework.boot.autoconfigure.SpringBootApplication; |
|||
import org.springframework.kafka.annotation.EnableKafka; |
|||
import org.springframework.scheduling.annotation.EnableScheduling; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2025年1月13日 |
|||
* @description |
|||
*/ |
|||
@SpringBootApplication |
|||
@EnableKafka |
|||
public class Application { |
|||
|
|||
public static void main(String[] args) { |
|||
SpringApplication.run(Application.class, args); |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
package com.bw.asr.cache; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import java.util.Map; |
|||
import java.util.concurrent.LinkedBlockingDeque; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2022年11月11日 |
|||
* @description 静态变量类 |
|||
*/ |
|||
@Slf4j |
|||
public class ConfigCache { |
|||
|
|||
/**启动条件**/ |
|||
public static boolean isStart = true; |
|||
/*****任务队列*****/ |
|||
public static LinkedBlockingDeque<Map<String, Object>> createTaskQueue = new LinkedBlockingDeque<Map<String,Object>>(); |
|||
public static LinkedBlockingDeque<Map<String, Object>> queryTaskQueue = new LinkedBlockingDeque<Map<String,Object>>(); |
|||
|
|||
|
|||
/** |
|||
* 队列录入任务 |
|||
* @param queue |
|||
* @param task |
|||
*/ |
|||
public static void putQueue(LinkedBlockingDeque<Map<String, Object>> queue,Map<String, Object> task){ |
|||
//next app 写入队列准备调出 |
|||
try { |
|||
queue.put(task); |
|||
} catch (InterruptedException e) { |
|||
log.error("队列写入data失败---"); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,39 @@ |
|||
package com.bw.asr.controller; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RequestMethod; |
|||
import org.springframework.web.bind.annotation.ResponseBody; |
|||
|
|||
import com.bw.asr.service.TaskReceiveService; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
/** |
|||
* 任务接收控制层 |
|||
* @author jian.mao |
|||
* @date 2025年1月14日 |
|||
* @description |
|||
*/ |
|||
@Controller |
|||
@RequestMapping("/task") |
|||
@Slf4j |
|||
public class TaskReceiveController { |
|||
@Resource |
|||
private TaskReceiveService taskReceiveService; |
|||
@PostMapping("/put") |
|||
@ResponseBody |
|||
public String put(@RequestBody String dataJson){ |
|||
String response = taskReceiveService.put(dataJson); |
|||
return response; |
|||
} |
|||
@RequestMapping(value = "/hello", method = RequestMethod.GET) |
|||
@ResponseBody |
|||
public String hello(String param, String token) { |
|||
return "123"; |
|||
} |
|||
} |
@ -0,0 +1,177 @@ |
|||
package com.bw.asr.entity; |
|||
|
|||
|
|||
/** |
|||
* 常量实体类 |
|||
* @author jian.mao |
|||
* @date 2022年11月15日 |
|||
* @description |
|||
*/ |
|||
public class Constants { |
|||
|
|||
/*************************蓝图常量key名称*********************************/ |
|||
public final static String SCHEDULING = "scheduling"; |
|||
public final static String TYPE = "type"; |
|||
public final static String INTERVAL = "interval"; |
|||
public final static String CREATED = "created"; |
|||
public final static String LAST_EDIT = "last_edit"; |
|||
public final static String BLUEPRINT_ID = "blueprint_id"; |
|||
public final static String BLUEPRINTID = "blueprintId"; |
|||
public final static String BLUEPRINT_NAME = "name"; |
|||
public final static String SCENARIO = "scenario"; |
|||
public final static String AUTOCOMMITTRIGGERLAST = "autoCommitTriggerLast"; |
|||
public final static String FRESHVARIABLES = "freshVariables"; |
|||
public final static String AUTOCOMMIT = "autoCommit"; |
|||
public final static String MAXERRORS = "maxErrors"; |
|||
public final static String DATALOSS = "dataloss"; |
|||
public final static String POSITION = "position"; |
|||
public final static String SCENES_ID = "scenes_id"; |
|||
public final static String SCENESID = "scenesId"; |
|||
public final static String MULTI_BRANCH = "multi_branch"; |
|||
|
|||
public final static String SINGLE = "single"; |
|||
/**已重试次数**/ |
|||
public final static String ERROR_TIME = "error_time"; |
|||
public final static String PREVIOUS_RESULT = "previous_result"; |
|||
|
|||
/****数据id*****/ |
|||
public final static String BUSINESSKEY = "businessKey"; |
|||
|
|||
|
|||
/*************************metadata常量key名称*********************************/ |
|||
public final static String LABEL_COL = "label_col"; |
|||
public final static String LABEL = "label"; |
|||
public final static String USER = "user"; |
|||
public final static String ADMIN = "admin"; |
|||
public final static String ADDRESS = "address"; |
|||
public final static String DATASOURCE = "datasource"; |
|||
public final static String INDEX = "index"; |
|||
|
|||
/*************************app常量key名称*********************************/ |
|||
public final static String APPS = "apps"; |
|||
public final static String TRANSFER_ID = "transfer_id"; |
|||
public final static String MODULE = "module"; |
|||
public final static String VERSION = "version"; |
|||
public final static String METADATA = "metadata"; |
|||
public final static String APP_NAME = "name"; |
|||
public final static String DESCRIBE = "describe"; |
|||
public final static String NEXT_APP_ID = "next_app_id"; |
|||
public final static String EDGE_ID = "edge_id"; |
|||
public final static String START_ID = "start_id"; |
|||
public final static String END_ID = "end_id"; |
|||
|
|||
public final static String WAIT_CONDITION = "wait_condition"; |
|||
public final static String START_TAG = "start_tag"; |
|||
|
|||
/*************************module类型*********************************/ |
|||
public final static String FILE = "file"; |
|||
public final static String OCR = "OCR"; |
|||
public final static String FILTER = "Filter"; |
|||
public final static String CHATGPT = "ChatGPT"; |
|||
public final static String MYSQL = "mysql"; |
|||
|
|||
/*************************other类型*********************************/ |
|||
public final static String UNDERLINE = "_"; |
|||
public final static String RESULT_TOPIC = null; |
|||
public static final String EMPTY = ""; |
|||
public static final String HTTP = "http"; |
|||
public static final String REQUEST_ERROR_MESSAGE = "Download failed error is"; |
|||
public static final String REQUEST_RESULT = "result"; |
|||
public static final String REQUEST_RESULT_RESULTS = "results"; |
|||
public static final String MAP_TYPE = "Map"; |
|||
public static final String LIST_TYPE = "List"; |
|||
public static final String STRING_TYPE = "String"; |
|||
public static final String DOCUMENT_TYPE = "doc"; |
|||
public static final String FILTER_ZH = "过滤器"; |
|||
|
|||
public static final String JSON_SELE_SYMBOL = "$."; |
|||
public static final String LEFT_BRACKETS = "["; |
|||
public static final String RIGTH_BRACKETS = "]"; |
|||
public static final String TASKTYPE = "taskType"; |
|||
public static final Integer USER_TYPE = 1; |
|||
public static final Integer KEYWORD_TYPE = 0; |
|||
public static final Integer DETAIL_TYPE = 2; |
|||
public static final String CID = "cid"; |
|||
public static final String SITETYPE = "siteType"; |
|||
public static final Integer DEFULT_SUBJECTID = 304864; |
|||
public static final Integer DEFULT_CRAWLCYCLICITYTIME = 1440; |
|||
public static final String CRAWLENDTIME = "crawlEndTime"; |
|||
public static final String CRAWLSTARTTIME = "crawlStartTime"; |
|||
public static final String CRAWLPAGETYPES = "crawlPageTypes"; |
|||
public static final String APPID = "113ic"; |
|||
public static final String APP_ID = "appId"; |
|||
public final static String ID = "id"; |
|||
public static final Integer DEFULT_CRAWLPERIODHOUR = 24; |
|||
public static final String CREATEUSERID = "662015832180933762"; |
|||
public static final String CRAWL_ADD_URL = "https://caiji.percent.cn/api/crawl/remote/task/save"; |
|||
public static final String CRAWLKEYWORD = "crawlKeyword"; |
|||
public static final String ATTACHTAG = "attachTag"; |
|||
public static final String ATTACHTAG_VALUE = "analyze"; |
|||
public static final String KEYWORD = "keyword"; |
|||
public static final String SITEID = "siteId"; |
|||
public static final String RESULTS = "results"; |
|||
public static final String RESULT = "result"; |
|||
public static final String CRAWLDATAFLAG = "crawlDataFlag"; |
|||
public static final String CRAWLDATAFLAG_PREFIX = "\"crawlDataFlag\":\"keyword:"; |
|||
public static final String TID = "tid"; |
|||
public static final Long TIME_OUT = 1800000L; |
|||
public static final String ATTR = "attr"; |
|||
public static final String HASVIDEO = "hasVideo"; |
|||
public static final String CRAWL_END_MARK = "crawl_end_mark"; |
|||
public static final String CRAWL_END_MESSAGE = "crawl_end_message"; |
|||
public static final String CRAWL_END_MESSAGE_VALUE = "数据采集完成"; |
|||
public static final String SUBJECTID = "subjectId"; |
|||
public static final String TASKID = "taskId"; |
|||
public static final int SUCCESS_CODE = 200; |
|||
public static final String WEB_URL_SUFFIX = "/api/aogeo/api/cda/caiji/status"; |
|||
public static final String STATUS = "status"; |
|||
/************************redis*************************************/ |
|||
public static final String LOCK_KEY = "myLock"; |
|||
public static final long LOCK_EXPIRE_TIME = 300000; |
|||
|
|||
/************************应用参数*************************************/ |
|||
public static final String CODE = "code"; |
|||
public static final String MESSAGE = "message"; |
|||
public static final String INPUT = "input"; |
|||
public static final String OUTPUT = "output"; |
|||
public static final String FORM = "form"; |
|||
public static final String FIELD = "field"; |
|||
public static final String VALUE = "value"; |
|||
public static final String DATA = "data"; |
|||
public static final String COLON_EN = ":"; |
|||
/******************************admin*******************************/ |
|||
public static final String AUTHORIZATION = "authorization"; |
|||
public static final String TEMPERATURE = "temperature"; |
|||
public static final String FIELDTYPE = "fieldType"; |
|||
public static final String TOP_P = "top_p"; |
|||
public static final String MODEL = "model"; |
|||
public static final String PROMPT = "prompt"; |
|||
public static final String CHATGLM_TURBO_URL = "https://open.bigmodel.cn/api/paas/v4/chat/completions"; |
|||
public static final String CHOICES = "choices"; |
|||
public static final String CONTENT = "content"; |
|||
public static final String GRANT_TYPE = "grant_type"; |
|||
public static final String CLIENT_CREDENTIALS = "client_credentials"; |
|||
public static final String CLIENT_SECRET = "client_secret"; |
|||
public static final String CLIENT_ID = "client_id"; |
|||
public static final String ACCESS_TOKEN = "access_token"; |
|||
public static final String APIKEY = "apiKey"; |
|||
public static final String SECRETKEY = "secretKey"; |
|||
public static final String TOKENURL = "tokenUrl"; |
|||
public static final String CREATEURL = "createUrl"; |
|||
public static final String SPEECH_URL = "speech_url"; |
|||
public static final String FORMAT = "format"; |
|||
public static final String RATE = "rate"; |
|||
public static final String PID = "pid"; |
|||
public static final String TASK_ID = "task_id"; |
|||
public static final String ERROR_MSG = "error_msg"; |
|||
public static final String TASK_IDS = "task_ids"; |
|||
public static final String QUERYURL = "queryUrl"; |
|||
public static final String TASKS_INFO = "tasks_info"; |
|||
public static final String TASK_STATUS = "task_status"; |
|||
public static final String SUCCESS = "Success"; |
|||
public static final String RUNNING = "Running"; |
|||
public static final String TASK_RESULT = "task_result"; |
|||
public static final String ISLAST = "isLast"; |
|||
public static final Object ERR_MSG = "err_msg"; |
|||
public static final String TRACE = "trace"; |
|||
} |
@ -0,0 +1,222 @@ |
|||
package com.bw.asr.handler; |
|||
|
|||
import java.io.File; |
|||
import java.io.IOException; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.concurrent.LinkedBlockingDeque; |
|||
import java.util.concurrent.LinkedBlockingQueue; |
|||
import java.util.concurrent.ThreadPoolExecutor; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
import org.apache.commons.io.FileUtils; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.boot.ApplicationArguments; |
|||
import org.springframework.boot.ApplicationRunner; |
|||
import org.springframework.core.annotation.Order; |
|||
import org.springframework.data.redis.core.StringRedisTemplate; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bfd.util.PauseTool; |
|||
import com.bw.asr.cache.ConfigCache; |
|||
import com.bw.asr.service.AsrTaskService; |
|||
import com.bw.asr.utils.DateUtil; |
|||
import com.bw.asr.utils.FileUtil; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2025年1月13日 |
|||
* @description |
|||
*/ |
|||
@Component |
|||
@Order(value = 1) |
|||
@Slf4j |
|||
public class MainHandler implements ApplicationRunner { |
|||
|
|||
@Value("${task.create-task-queue-path}") |
|||
private String createTaskPath; |
|||
@Value("${task.query-task-queue-path}") |
|||
private String queryTaskPath; |
|||
@Value("${zookeeper.connection-string}") |
|||
private String connectionString; |
|||
@Value("${zookeeper.publish-node}") |
|||
private String nodePath; |
|||
@Resource |
|||
private StringRedisTemplate stringRedisTemplate; |
|||
@Resource |
|||
private AsrTaskService asrTaskService; |
|||
/***线程池参数***/ |
|||
@Value("${threadPool.corePoolSize}") |
|||
private int corePoolSize; |
|||
@Value("${threadPool.maximumPoolSize}") |
|||
private int maximumPoolSize; |
|||
@Value("${threadPool.keepAliveTime}") |
|||
private long keepAliveTime; |
|||
@Value("${threadPool.queueSize}") |
|||
private int queueSize; |
|||
|
|||
/** |
|||
*执行入口 |
|||
*/ |
|||
@Override |
|||
public void run(ApplicationArguments args) throws Exception { |
|||
PauseTool pauseTool = new PauseTool(); |
|||
pauseTool.initializeRedisCache(stringRedisTemplate); |
|||
pauseTool.setupZookeeperListener(connectionString, nodePath); |
|||
//线程池方式 |
|||
ThreadPoolExecutor executor = new ThreadPoolExecutor( |
|||
corePoolSize, |
|||
maximumPoolSize, |
|||
keepAliveTime, |
|||
TimeUnit.SECONDS, |
|||
new LinkedBlockingQueue<>(queueSize), |
|||
new ThreadPoolExecutor.CallerRunsPolicy() |
|||
); |
|||
//消费创建任务队列数据 |
|||
Thread createConsumerThread = new Thread(() -> { |
|||
while (true) { |
|||
try { |
|||
// 从队列中获取任务 |
|||
Map<String, Object> task = ConfigCache.createTaskQueue.take(); |
|||
// 提交给线程池执行 |
|||
executor.execute(() -> createTask(task)); |
|||
} catch (InterruptedException e) { |
|||
// 恢复中断状态 |
|||
Thread.currentThread().interrupt(); |
|||
log.error("创建任务消费线程被中断"); |
|||
break; |
|||
} |
|||
} |
|||
}); |
|||
createConsumerThread.start(); |
|||
log.info("创建任务消费线程启动-----"); |
|||
|
|||
//消费查询任务队列数据 |
|||
Thread queryConsumerThread = new Thread(() -> { |
|||
while (true) { |
|||
try { |
|||
// 从队列中获取任务 |
|||
Map<String, Object> task = ConfigCache.createTaskQueue.take(); |
|||
// 提交给线程池执行 |
|||
executor.execute(() -> queryTask(task)); |
|||
} catch (InterruptedException e) { |
|||
// 恢复中断状态 |
|||
Thread.currentThread().interrupt(); |
|||
log.error("查询任务消费线程被中断"); |
|||
break; |
|||
} |
|||
//获取结果别太频繁 |
|||
DateUtil.sleep(5000); |
|||
} |
|||
}); |
|||
queryConsumerThread.start(); |
|||
log.info("查询任务消费线程启动-----"); |
|||
|
|||
//停止处理 |
|||
waitDown(); |
|||
//启动加载缓存任务 |
|||
readTask(createTaskPath, ConfigCache.createTaskQueue); |
|||
readTask(queryTaskPath, ConfigCache.queryTaskQueue); |
|||
} |
|||
|
|||
/** |
|||
* 创建任务执行方法 |
|||
* @param task |
|||
*/ |
|||
private void createTask(Map<String, Object> task) { |
|||
asrTaskService.create(task); |
|||
} |
|||
|
|||
/** |
|||
* 查询任务执行方法 |
|||
* @param task |
|||
*/ |
|||
private void queryTask(Map<String, Object> task) { |
|||
asrTaskService.query(task); |
|||
} |
|||
|
|||
|
|||
/****************************************************************load******************************************************************************/ |
|||
/** |
|||
* 加载文件中的任务 |
|||
* @param path 文件地址 |
|||
* @param queue 队列 |
|||
*/ |
|||
@SuppressWarnings("unchecked") |
|||
public static void readTask(String path, LinkedBlockingDeque<Map<String, Object>> queue) { |
|||
File file = new File(path); |
|||
if (file.exists()) { |
|||
List<String> tasks = null; |
|||
try { |
|||
tasks = FileUtils.readLines(file, "UTF-8"); |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
for (String taskStr : tasks) { |
|||
Map<String, Object> task = JSONObject.parseObject(taskStr); |
|||
try { |
|||
queue.put(task); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
file.delete(); |
|||
} |
|||
} |
|||
|
|||
/*******************************************************************stop************************************************************************/ |
|||
|
|||
/** |
|||
* 结束触发钩子 |
|||
*/ |
|||
public void waitDown() { |
|||
Runtime.getRuntime().addShutdownHook(new Thread() { |
|||
@Override |
|||
public void run() { |
|||
// 停止线程 |
|||
ConfigCache.isStart = false; |
|||
log.info("stop-------"); |
|||
writeTsskToFile(); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
|
|||
/** |
|||
* 任务持久化到硬盘 |
|||
*/ |
|||
public void writeTsskToFile() { |
|||
while (true) { |
|||
if (ConfigCache.queryTaskQueue.size() > 0) { |
|||
try { |
|||
Map<String, Object> task = ConfigCache.queryTaskQueue.take(); |
|||
FileUtil.writeFile(queryTaskPath, JSONObject.toJSONString(task)); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} else { |
|||
log.info("taskQueue write is file end"); |
|||
break; |
|||
} |
|||
} |
|||
while (true) { |
|||
if (ConfigCache.createTaskQueue.size() > 0) { |
|||
try { |
|||
Map<String, Object> task = ConfigCache.createTaskQueue.take(); |
|||
FileUtil.writeFile(createTaskPath, JSONObject.toJSONString(task)); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} else { |
|||
log.info("taskQueue write is file end"); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,24 @@ |
|||
package com.bw.asr.service; |
|||
|
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* asr任务操作接口 |
|||
* @author jian.mao |
|||
* @date 2025年1月13日 |
|||
* @description |
|||
*/ |
|||
public interface AsrTaskService { |
|||
|
|||
/** |
|||
* asr任务创建 |
|||
* @param task |
|||
*/ |
|||
public void create(Map<String, Object> task); |
|||
|
|||
/** |
|||
* asr任务查询 |
|||
* @param task |
|||
*/ |
|||
public void query(Map<String, Object> task); |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.bw.asr.service; |
|||
|
|||
/** |
|||
* 任务接收服务层 |
|||
* @author jian.mao |
|||
* @date 2025年1月14日 |
|||
* @description |
|||
*/ |
|||
public interface TaskReceiveService { |
|||
|
|||
/** |
|||
* 任务新增 |
|||
* @param dataJson |
|||
* @return |
|||
*/ |
|||
public String put(String dataJson); |
|||
} |
@ -0,0 +1,166 @@ |
|||
package com.bw.asr.service.impl; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.UUID; |
|||
|
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bw.asr.cache.ConfigCache; |
|||
import com.bw.asr.entity.Constants; |
|||
import com.bw.asr.service.AsrTaskService; |
|||
import com.bw.asr.utils.DataUtil; |
|||
import com.bw.asr.utils.DownLoadUtil; |
|||
import com.bw.asr.utils.SpringBootKafka; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
/** |
|||
* asr任务操作实现类 |
|||
* @author jian.mao |
|||
* @date 2025年1月13日 |
|||
* @description |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
public class AsrTaskServiceImpl implements AsrTaskService { |
|||
@Autowired |
|||
private SpringBootKafka springBootKafka; |
|||
@Value("${customize-kafka.producer.topic}") |
|||
private String topic; |
|||
@Override |
|||
public void create(Map<String, Object> task) { |
|||
// TODO Auto-generated method stub |
|||
Map<String, Object> data = (Map<String, Object>) task.get(Constants.DATA); |
|||
Map<String, Object> input = (Map<String, Object>) task.get(Constants.INPUT); |
|||
String token = getToken(input); |
|||
String createUrl = (String) input.get(Constants.CREATEURL); |
|||
String url = createUrl + token; |
|||
Map<String, Object> param = new HashMap<String, Object>(16); |
|||
//附件地址 |
|||
param.put(Constants.SPEECH_URL, DataUtil.getValue((String)input.get(Constants.SPEECH_URL), data)); |
|||
//附件格式 |
|||
param.put(Constants.FORMAT, input.get(Constants.FORMAT)); |
|||
//模型 |
|||
param.put(Constants.PID, input.get(Constants.PID)); |
|||
//采样率 |
|||
param.put(Constants.RATE, 1600); |
|||
//提交识别的音频 |
|||
String resStr = DownLoadUtil.doPost(url,JSONObject.toJSONString(param)); |
|||
JSONObject res = JSONObject.parseObject(resStr); |
|||
//判断是否创建成功 |
|||
if(res.containsKey(Constants.TASK_ID)) { |
|||
log.info("识别任务创建成功---,taskId:{}",res.get(Constants.TASK_ID)); |
|||
//传递给查询队列 |
|||
input.put(Constants.TASK_ID, res.get(Constants.TASK_ID)); |
|||
ConfigCache.putQueue(ConfigCache.queryTaskQueue, task); |
|||
}else { |
|||
//失败直接发走 |
|||
log.error("创建识别任务失败:{}", res.get(Constants.ERROR_MSG)); |
|||
// TODO: handle exception |
|||
//结果集 |
|||
Map<String, Object> result = new HashMap<String, Object>(16); |
|||
Map<String, Object> results = new HashMap<String, Object>(16); |
|||
//遍历入库返回结果,拼接响应内容 |
|||
results.put(Constants.ISLAST, 1); |
|||
results.put(Constants.CONTENT, "识别任务创建失败"); |
|||
results.put(Constants.ID, UUID.randomUUID().toString()); |
|||
result.put(Constants.RESULTS, JSONObject.toJSONString(results)); |
|||
result.put(Constants.MESSAGE, res.get(Constants.ERROR_MSG)); |
|||
result.put(Constants.STATUS, 2); |
|||
task.put(Constants.RESULT, result); |
|||
//发送kafka |
|||
springBootKafka.send(topic, JSONObject.toJSONString(task)); |
|||
log.info("数据流转至下游-------"); |
|||
} |
|||
} |
|||
|
|||
@Override |
|||
public void query(Map<String, Object> task) { |
|||
// TODO Auto-generated method stub |
|||
Map<String, Object> input = (Map<String, Object>) task.get(Constants.INPUT); |
|||
String token = getToken(input); |
|||
String queryUrl = (String) input.get(Constants.QUERYURL); |
|||
String url = queryUrl + token; |
|||
String taskId = (String) input.get(Constants.TASK_ID); |
|||
List<String> taskIds = new ArrayList<String>(); |
|||
taskIds.add(taskId); |
|||
Map<String, Object> param = new HashMap<String, Object>(16); |
|||
param.put(Constants.TASK_IDS, taskIds); |
|||
String resStr = DownLoadUtil.doPost(url, JSONObject.toJSONString(param)); |
|||
JSONObject res = JSONObject.parseObject(resStr); |
|||
List<Map<String, Object>> tasksInfo = (List<Map<String, Object>>) res.get(Constants.TASKS_INFO); |
|||
for (Map<String, Object> map : tasksInfo) { |
|||
String taskStatus = (String) map.get(Constants.TASK_STATUS); |
|||
if(Constants.SUCCESS.equals(taskStatus)) { |
|||
log.info("识别成功,获取识别结果,taskId:{}",taskId); |
|||
//识别成功,获取结果 |
|||
Map<String, Object> taskResult = (Map<String, Object>) map.get(Constants.TASK_RESULT); |
|||
List<String> contents = (List<String>) taskResult.get(Constants.RESULT); |
|||
String content = contents.get(0); |
|||
Map<String, Object> result = new HashMap<String, Object>(16); |
|||
Map<String, Object> results = new HashMap<String, Object>(16); |
|||
//遍历入库返回结果,拼接响应内容 |
|||
results.put(Constants.ISLAST, 1); |
|||
results.put(Constants.CONTENT, content); |
|||
results.put(Constants.ID, UUID.randomUUID().toString()); |
|||
result.put(Constants.RESULTS, JSONObject.toJSONString(results)); |
|||
result.put(Constants.MESSAGE, "成功"); |
|||
result.put(Constants.STATUS, 1); |
|||
task.put(Constants.RESULT, result); |
|||
//发送kafka |
|||
springBootKafka.send(topic, JSONObject.toJSONString(task)); |
|||
log.info("数据流转至下游-------"); |
|||
}else if(Constants.RUNNING.equals(taskStatus)) { |
|||
//未识别完,放回队列 |
|||
log.info("未识别完,taskId:{}",taskId); |
|||
ConfigCache.putQueue(ConfigCache.queryTaskQueue, task); |
|||
}else { |
|||
//识别失败 |
|||
Map<String, Object> taskResult = (Map<String, Object>) map.get(Constants.TASK_RESULT); |
|||
String errMsg = (String) taskResult.get(Constants.ERR_MSG); |
|||
Map<String, Object> result = new HashMap<String, Object>(16); |
|||
Map<String, Object> results = new HashMap<String, Object>(16); |
|||
//遍历入库返回结果,拼接响应内容 |
|||
results.put(Constants.ISLAST, 1); |
|||
results.put(Constants.CONTENT, errMsg); |
|||
results.put(Constants.ID, UUID.randomUUID().toString()); |
|||
result.put(Constants.RESULTS, JSONObject.toJSONString(results)); |
|||
result.put(Constants.MESSAGE, errMsg); |
|||
result.put(Constants.STATUS, 2); |
|||
task.put(Constants.RESULT, result); |
|||
//发送kafka |
|||
springBootKafka.send(topic, JSONObject.toJSONString(task)); |
|||
log.info("数据流转至下游-------"); |
|||
} |
|||
break; |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* 获取token |
|||
* @param task |
|||
* @return |
|||
*/ |
|||
@SuppressWarnings("unchecked") |
|||
private String getToken(Map<String, Object> input) { |
|||
String apiKey = (String) input.get(Constants.APIKEY); |
|||
String secretKey = (String) input.get(Constants.SECRETKEY); |
|||
String tokenUrl = (String) input.get(Constants.TOKENURL); |
|||
Map<String, Object> param = new HashMap<String, Object>(16); |
|||
param.put(Constants.GRANT_TYPE, Constants.CLIENT_CREDENTIALS); |
|||
param.put(Constants.CLIENT_ID, apiKey); |
|||
param.put(Constants.CLIENT_SECRET, secretKey); |
|||
String resStr = DownLoadUtil.doPostFrom(tokenUrl, param); |
|||
JSONObject res = JSONObject.parseObject(resStr); |
|||
String accessToken = (String) res.get(Constants.ACCESS_TOKEN); |
|||
return accessToken; |
|||
} |
|||
} |
@ -0,0 +1,55 @@ |
|||
package com.bw.asr.service.impl; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bw.asr.cache.ConfigCache; |
|||
import com.bw.asr.entity.Constants; |
|||
import com.bw.asr.service.TaskReceiveService; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
/** |
|||
* 任务接收服务层实现类 |
|||
* @author jian.mao |
|||
* @date 2025年1月14日 |
|||
* @description |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
public class TaskReceiveServiceImpl implements TaskReceiveService { |
|||
|
|||
@Override |
|||
public String put(String dataJson) { |
|||
Map<String, Object> response = new HashMap<>(16); |
|||
int code = 200; |
|||
String message = "success"; |
|||
Map<String, Object> task = null; |
|||
try { |
|||
task = JSONObject.parseObject(dataJson); |
|||
} catch (Exception e) { |
|||
log.error("参数结构不合法,", e); |
|||
code = 100010; |
|||
message = "参数不合法"; |
|||
} |
|||
// 写入队列 |
|||
try { |
|||
if(task.containsKey(Constants.TRACE) && (boolean)task.get(Constants.TRACE)){ |
|||
ConfigCache.createTaskQueue.putFirst(task); |
|||
}else{ |
|||
ConfigCache.createTaskQueue.put(task); |
|||
} |
|||
} catch (InterruptedException e) { |
|||
log.error("任务写入队列异常,", e); |
|||
code = 100011; |
|||
message = "任务写入队列失败"; |
|||
} |
|||
response.put(Constants.CODE, code); |
|||
response.put(Constants.MESSAGE, message); |
|||
return JSONObject.toJSONString(response); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,48 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.alibaba.fastjson.JSONPath; |
|||
|
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* @author:jinming |
|||
* @className:DataUtil |
|||
* @version:1.0 |
|||
* @description: 获取dataValue的值 |
|||
* @Date:2023/11/1 9:54 |
|||
*/ |
|||
public class DataUtil { |
|||
/** |
|||
* |
|||
* @param key 传入的key |
|||
* @param dataMap 数据map |
|||
* @return 根据传入的参数进行判断解析,返回正确的dataValue |
|||
*/ |
|||
public static Object getValue(String key, Map dataMap) { |
|||
Object dataValue; |
|||
String isJson = "#json#"; |
|||
if (key.contains(isJson)) { |
|||
//进行第一次拆分,获取#json#前面的部分 |
|||
String[] keySplit = key.split(isJson); |
|||
String firstDataKey = keySplit[0]; |
|||
String[] firstDataKeySplit = firstDataKey.split(":"); |
|||
//取出前半部分对应的JSON数据并转换为JSONObject |
|||
String dataJson = (String) dataMap.get(firstDataKeySplit[0]); |
|||
JSONObject dataJsonObject = JSON.parseObject(dataJson); |
|||
//根据key的后半部分取出对应JSONObject中的值 |
|||
String firstDataKeyJson = (String) JSONPath.eval(dataJsonObject, firstDataKeySplit[1]); |
|||
String secDataKey = keySplit[1]; |
|||
JSONObject firstDataJsonObject = JSON.parseObject(firstDataKeyJson); |
|||
dataValue = JSONPath.eval(firstDataJsonObject, secDataKey); |
|||
return dataValue; |
|||
} |
|||
String[] keySplit = key.split(":"); |
|||
String jsonPath = keySplit[1]; |
|||
String dataJson = (String) dataMap.get(keySplit[0]); |
|||
JSONObject dataJsonObject = JSON.parseObject(dataJson); |
|||
dataValue = JSONPath.eval(dataJsonObject, jsonPath); |
|||
return dataValue; |
|||
} |
|||
} |
@ -0,0 +1,177 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
|
|||
import java.math.BigInteger; |
|||
import java.security.MessageDigest; |
|||
import java.security.NoSuchAlgorithmException; |
|||
import java.text.ParseException; |
|||
import java.text.SimpleDateFormat; |
|||
import java.time.LocalDateTime; |
|||
import java.time.format.DateTimeFormatter; |
|||
import java.util.Date; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
|
|||
/** |
|||
* 日期工具类 |
|||
* |
|||
* @author jian.mao |
|||
* @date 2022年11月15日 |
|||
* @description |
|||
*/ |
|||
@Slf4j |
|||
public class DateUtil { |
|||
|
|||
/** |
|||
* @return |
|||
*/ |
|||
public static String getTimeStrForNow() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHH"); |
|||
return sdf.format(new Date()); |
|||
} |
|||
|
|||
|
|||
public static String getTimeStrForDay(long time) { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
|||
|
|||
return sdf.format(new Date(time * 1000)); |
|||
} |
|||
|
|||
public static String getTimeStrForDay() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); |
|||
|
|||
return sdf.format(new Date()); |
|||
} |
|||
|
|||
|
|||
public static String getDateTime() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
String time = sdf.format(new Date()); |
|||
return time; |
|||
} |
|||
|
|||
public static String getDateTime(Long timestap) { |
|||
|
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
String time = sdf.format(new Date(timestap)); |
|||
return time; |
|||
} |
|||
|
|||
public static String getDate(Long timestap) { |
|||
|
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
|||
String time = sdf.format(new Date(timestap)); |
|||
return time; |
|||
} |
|||
|
|||
public static String getDateTimeForMonth() { |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM"); |
|||
String time = sdf.format(new Date()); |
|||
return time; |
|||
} |
|||
|
|||
/** |
|||
* 休眠 |
|||
* |
|||
* @param millis 毫秒 |
|||
*/ |
|||
public static void sleep(long millis) { |
|||
try { |
|||
Thread.sleep(millis); |
|||
} catch (InterruptedException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 1. @Description:时间戳转时间 |
|||
* 2. @Author: ying.zhao |
|||
* 3. @Date: 2023/3/28 |
|||
*/ |
|||
|
|||
public static String timestampToDate(String time) { |
|||
int thirteen = 13; |
|||
int ten = 10; |
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
// if (time.length() == thirteen) { |
|||
if (time.length() > ten) { |
|||
return sdf.format(new Date(Long.parseLong(time))); |
|||
} else { |
|||
return sdf.format(new Date(Integer.parseInt(time) * 1000L)); |
|||
} |
|||
} |
|||
|
|||
public static String parseCreated(String jsonTime){ |
|||
String formattedDateTime = getDateTime(); |
|||
try { |
|||
// 使用fastjson解析JSON数据 |
|||
JSONObject jsonObject = JSON.parseObject(jsonTime); |
|||
// 获取日期和时间的值 |
|||
JSONObject dateObject = jsonObject.getJSONObject("date"); |
|||
int day = dateObject.getIntValue("day"); |
|||
int month = dateObject.getIntValue("month"); |
|||
int year = dateObject.getIntValue("year"); |
|||
|
|||
JSONObject timeObject = jsonObject.getJSONObject("time"); |
|||
int hour = timeObject.getIntValue("hour"); |
|||
int minute = timeObject.getIntValue("minute"); |
|||
int second = timeObject.getIntValue("second"); |
|||
|
|||
// 创建LocalDateTime对象 |
|||
LocalDateTime dateTime = LocalDateTime.of(year, month, day, hour, minute, second); |
|||
|
|||
// 定义日期时间格式化器 |
|||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); |
|||
|
|||
// 格式化日期时间 |
|||
formattedDateTime = dateTime.format(formatter); |
|||
} catch (Exception e) { |
|||
log.info("日期转换失败:{}",e); |
|||
} |
|||
return formattedDateTime; |
|||
} |
|||
|
|||
/** |
|||
* 字符串转换日期 |
|||
* @param format |
|||
* @param date |
|||
* @return |
|||
*/ |
|||
public static Date strToDate(String format,String date){ |
|||
SimpleDateFormat sdf = new SimpleDateFormat(format); |
|||
if (date == null || date.equals("")){ |
|||
return new Date(); |
|||
}else{ |
|||
Date ru = null; |
|||
try { |
|||
ru = sdf.parse(date); |
|||
} catch (ParseException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
return ru; |
|||
} |
|||
} |
|||
/** |
|||
* 日期格式话 |
|||
* @param format 日期格式 |
|||
* @param dater 要转换的日期,默认当前时间 |
|||
* @return |
|||
*/ |
|||
public static String FormatDate(String format,Date date){ |
|||
String fromatDate = null; |
|||
SimpleDateFormat sdf = new SimpleDateFormat(format); |
|||
if (date == null){ |
|||
fromatDate = sdf.format(new Date()); |
|||
}else{ |
|||
fromatDate = sdf.format(date); |
|||
} |
|||
return fromatDate; |
|||
} |
|||
public static void main(String[] args) { |
|||
String time = timestampToDate("955814400000"); |
|||
System.out.println(time); |
|||
} |
|||
} |
@ -0,0 +1,915 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import java.io.IOException; |
|||
import java.security.KeyManagementException; |
|||
import java.security.NoSuchAlgorithmException; |
|||
import java.security.cert.CertificateException; |
|||
import java.util.LinkedList; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
import javax.net.ssl.SSLContext; |
|||
import javax.net.ssl.TrustManager; |
|||
import javax.net.ssl.X509TrustManager; |
|||
|
|||
import org.apache.http.HttpEntity; |
|||
import org.apache.http.HttpHost; |
|||
import org.apache.http.HttpResponse; |
|||
import org.apache.http.NameValuePair; |
|||
import org.apache.http.StatusLine; |
|||
import org.apache.http.auth.AuthScope; |
|||
import org.apache.http.auth.UsernamePasswordCredentials; |
|||
import org.apache.http.client.AuthCache; |
|||
import org.apache.http.client.ClientProtocolException; |
|||
import org.apache.http.client.CredentialsProvider; |
|||
import org.apache.http.client.HttpClient; |
|||
import org.apache.http.client.HttpRequestRetryHandler; |
|||
import org.apache.http.client.config.RequestConfig; |
|||
import org.apache.http.client.entity.UrlEncodedFormEntity; |
|||
import org.apache.http.client.methods.CloseableHttpResponse; |
|||
import org.apache.http.client.methods.HttpGet; |
|||
import org.apache.http.client.methods.HttpPost; |
|||
import org.apache.http.client.protocol.HttpClientContext; |
|||
import org.apache.http.config.Registry; |
|||
import org.apache.http.config.RegistryBuilder; |
|||
import org.apache.http.config.SocketConfig; |
|||
import org.apache.http.conn.socket.ConnectionSocketFactory; |
|||
import org.apache.http.conn.socket.LayeredConnectionSocketFactory; |
|||
import org.apache.http.conn.socket.PlainConnectionSocketFactory; |
|||
import org.apache.http.conn.ssl.SSLConnectionSocketFactory; |
|||
import org.apache.http.entity.StringEntity; |
|||
import org.apache.http.impl.auth.BasicScheme; |
|||
import org.apache.http.impl.client.BasicAuthCache; |
|||
import org.apache.http.impl.client.BasicCredentialsProvider; |
|||
import org.apache.http.impl.client.CloseableHttpClient; |
|||
import org.apache.http.impl.client.HttpClientBuilder; |
|||
import org.apache.http.impl.client.HttpClients; |
|||
import org.apache.http.impl.client.LaxRedirectStrategy; |
|||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; |
|||
import org.apache.http.message.BasicNameValuePair; |
|||
import org.apache.http.util.EntityUtils; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import com.bw.asr.entity.Constants; |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
/** |
|||
* 下载工具类 |
|||
* @author jian.mao |
|||
* @date 2023年9月19日 |
|||
* @description |
|||
*/ |
|||
public class DownLoadUtil { |
|||
|
|||
private static String ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"; |
|||
private final static Logger log = LoggerFactory.getLogger(DownLoadUtil.class); |
|||
/** 代理服务器(产品官网 www.16yun.cn) **/ |
|||
final static String PROXYHOST = "u270.40.tp.16yun.cn"; |
|||
final static Integer PROXYPORT = 6448; |
|||
/** 代理验证信息 **/ |
|||
final static String PROXYUSER = "16HFBVJC"; |
|||
final static String PROXYPASS = "897944"; |
|||
|
|||
private static PoolingHttpClientConnectionManager cm = null; |
|||
private static HttpRequestRetryHandler httpRequestRetryHandler = null; |
|||
private static HttpHost proxy = null; |
|||
|
|||
private static CredentialsProvider credsProvider = null; |
|||
private static RequestConfig reqConfig = null; |
|||
|
|||
static { |
|||
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory |
|||
.getSocketFactory(); |
|||
LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory |
|||
.getSocketFactory(); |
|||
|
|||
Registry registry = RegistryBuilder.create().register("http", plainsf) |
|||
.register("https", sslsf).build(); |
|||
|
|||
cm = new PoolingHttpClientConnectionManager(registry); |
|||
cm.setMaxTotal(20); |
|||
cm.setDefaultMaxPerRoute(5); |
|||
|
|||
proxy = new HttpHost(PROXYHOST, PROXYPORT, "https"); |
|||
|
|||
credsProvider = new BasicCredentialsProvider(); |
|||
credsProvider.setCredentials(AuthScope.ANY, |
|||
new UsernamePasswordCredentials(PROXYUSER, PROXYPASS)); |
|||
|
|||
reqConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) |
|||
.setConnectTimeout(5000).setSocketTimeout(5000) |
|||
.setExpectContinueEnabled(false) |
|||
.setProxy(new HttpHost(PROXYHOST, PROXYPORT)).build(); |
|||
} |
|||
|
|||
/** |
|||
* 模拟客户端get请求 |
|||
* |
|||
* @param url |
|||
* 模拟请求得url |
|||
* @param headers |
|||
* 头部信息,没有可以不传 |
|||
* @return |
|||
*/ |
|||
@SafeVarargs |
|||
public static String proxyDoGet(String url, Map<String, Object>... headers) { |
|||
// 设置超时时间 |
|||
int timeout = 30; |
|||
RequestConfig config = RequestConfig.custom() |
|||
.setConnectTimeout(timeout * 1000) |
|||
.setConnectionRequestTimeout(timeout * 1000) |
|||
.setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(timeout * 1000) |
|||
.setTcpNoDelay(true).build(); |
|||
AuthCache authCache = new BasicAuthCache(); |
|||
authCache.put(proxy, new BasicScheme()); |
|||
HttpClientContext localContext = HttpClientContext.create(); |
|||
localContext.setAuthCache(authCache); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
CloseableHttpClient httpClient = httpBuilder |
|||
.setDefaultSocketConfig(socketConfig) |
|||
.setDefaultRequestConfig(config) |
|||
.setDefaultCredentialsProvider(credsProvider).build(); |
|||
HttpGet httpGet = new HttpGet(url); |
|||
httpGet.setConfig(reqConfig); |
|||
if (headers != null && headers.length > 0) { |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key, tempHeaders.get(key).toString()); |
|||
} |
|||
} else { |
|||
httpGet.setHeader("Accept", |
|||
"application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); |
|||
} |
|||
CloseableHttpResponse response = null; |
|||
String html = ""; |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
try { |
|||
response = httpClient.execute(httpGet, localContext); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if (statusLine.getStatusCode() == successCode) { |
|||
if (responseEntity != null) { |
|||
html = EntityUtils.toString(responseEntity, "utf-8"); |
|||
System.out.println("响应内容长度为:" |
|||
+ responseEntity.getContentLength()); |
|||
// 下载结果为空不正常 |
|||
if (html.equals(Constants.EMPTY)) { |
|||
html = "Download failed error is:reslut is null"; |
|||
} |
|||
} |
|||
} else if (statusLine.getStatusCode() == notFundCode) { |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
} else { |
|||
throw new Exception("请求错误,code码为:" + statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:reslut is null"; |
|||
}finally{ |
|||
try { |
|||
response.close(); |
|||
httpClient.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
return html; |
|||
|
|||
} |
|||
|
|||
|
|||
public static String httpsslProxyGet(String url, Map<String, Object>... headers) throws Exception { |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
|
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
connManager.setMaxTotal(50); |
|||
connManager.setDefaultMaxPerRoute(10); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
// 设置超时时间 |
|||
int timeout = 30; |
|||
RequestConfig config = RequestConfig.custom() |
|||
.setConnectTimeout(timeout * 1000) |
|||
.setConnectionRequestTimeout(timeout * 1000) |
|||
.setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(timeout * 1000) |
|||
.setTcpNoDelay(true).build(); |
|||
AuthCache authCache = new BasicAuthCache(); |
|||
authCache.put(proxy, new BasicScheme()); |
|||
HttpClientContext localContext = HttpClientContext.create(); |
|||
localContext.setAuthCache(authCache); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
CloseableHttpClient httpClient = httpBuilder |
|||
.setConnectionManager(connManager) |
|||
.setDefaultSocketConfig(socketConfig) |
|||
.setDefaultRequestConfig(config) |
|||
.setDefaultCredentialsProvider(credsProvider).build(); |
|||
HttpGet httpGet = new HttpGet(url); |
|||
httpGet.setConfig(reqConfig); |
|||
if (headers != null && headers.length > 0) { |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key, tempHeaders.get(key).toString()); |
|||
} |
|||
} else { |
|||
httpGet.setHeader("Accept", |
|||
"application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); |
|||
} |
|||
CloseableHttpResponse response = null; |
|||
String html = ""; |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
try { |
|||
response = httpClient.execute(httpGet, localContext); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if (statusLine.getStatusCode() == successCode) { |
|||
if (responseEntity != null) { |
|||
html = EntityUtils.toString(responseEntity, "utf-8"); |
|||
System.out.println("响应内容长度为:" |
|||
+ responseEntity.getContentLength()); |
|||
// 下载结果为空不正常 |
|||
if (html.equals(Constants.EMPTY)) { |
|||
html = "Download failed error is:reslut is null"; |
|||
} |
|||
} |
|||
} else if (statusLine.getStatusCode() == notFundCode) { |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
} else { |
|||
throw new Exception("请求错误,code码为:" + statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:reslut is null"; |
|||
}finally{ |
|||
try { |
|||
response.close(); |
|||
httpClient.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
return html; |
|||
|
|||
} |
|||
|
|||
|
|||
/** |
|||
* json参数方式POST提交 |
|||
* @param url |
|||
* @param params |
|||
* @return |
|||
*/ |
|||
public static String doPost(String url, String params, Map<String, Object>... headers){ |
|||
String strResult = ""; |
|||
//设置超时时间 |
|||
int timeout = 60; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(timeout * 1000) |
|||
.setTcpNoDelay(true).build(); |
|||
// AuthCache authCache = new BasicAuthCache(); |
|||
// authCache.put(proxy, new BasicScheme()); |
|||
// HttpClientContext localContext = HttpClientContext.create(); |
|||
// localContext.setAuthCache(authCache); |
|||
// 1. 获取默认的client实例 |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
httpBuilder.setUserAgent(ua); |
|||
HttpClient client = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).build(); |
|||
// HttpClient client = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).setConnectionManager(cm) |
|||
// .setDefaultCredentialsProvider(credsProvider).build(); |
|||
// 2. 创建httppost实例 |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
if (headers != null && headers.length > 0) { |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key, tempHeaders.get(key).toString()); |
|||
} |
|||
} else { |
|||
httpPost.addHeader("Content-Type", "application/json;charset=utf-8"); |
|||
} |
|||
HttpResponse resp = null; |
|||
try { |
|||
httpPost.setEntity(new StringEntity(params,"utf-8")); |
|||
resp = client.execute(httpPost); |
|||
// resp = client.execute(httpPost,localContext); |
|||
StatusLine statusLine = resp.getStatusLine(); |
|||
System.out.println("响应状态为:" + resp.getStatusLine()); |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
// 7. 获取响应entity |
|||
HttpEntity respEntity = resp.getEntity(); |
|||
strResult = EntityUtils.toString(respEntity, "UTF-8"); |
|||
if(strResult.equals(Constants.EMPTY)){ |
|||
strResult = "Download failed error is:reslut is null"; |
|||
} |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
strResult = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
return strResult; |
|||
} |
|||
public static String httpPost(String url,String params) { |
|||
String html=""; |
|||
html = doPost(url,params); |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(5000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
html = doPost(url,params); |
|||
} |
|||
return html; |
|||
} |
|||
/** |
|||
* 绕过验证 |
|||
* |
|||
* @return |
|||
* @throws NoSuchAlgorithmException |
|||
* @throws KeyManagementException |
|||
*/ |
|||
public static SSLContext createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException { |
|||
SSLContext sc = SSLContext.getInstance("SSLv3"); |
|||
|
|||
// 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法 |
|||
X509TrustManager trustManager = new X509TrustManager() { |
|||
@Override |
|||
public void checkClientTrusted( |
|||
java.security.cert.X509Certificate[] paramArrayOfX509Certificate, |
|||
String paramString) throws CertificateException { |
|||
} |
|||
|
|||
@Override |
|||
public void checkServerTrusted( |
|||
java.security.cert.X509Certificate[] paramArrayOfX509Certificate, |
|||
String paramString) throws CertificateException { |
|||
} |
|||
|
|||
@Override |
|||
public java.security.cert.X509Certificate[] getAcceptedIssuers() { |
|||
return null; |
|||
} |
|||
}; |
|||
|
|||
sc.init(null, new TrustManager[] { trustManager }, null); |
|||
return sc; |
|||
} |
|||
/** |
|||
* 模拟请求 |
|||
* |
|||
* @param url 资源地址 |
|||
* @param map 参数列表 |
|||
* @param encoding 编码 |
|||
* @return |
|||
* @throws NoSuchAlgorithmException |
|||
* @throws KeyManagementException |
|||
* @throws IOException |
|||
* @throws ClientProtocolException |
|||
*/ |
|||
public static String httpsslGet(String url,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
CloseableHttpClient client = null; |
|||
HttpEntity responseEntity = null; |
|||
CloseableHttpResponse response = null; |
|||
try { |
|||
log.debug("DownLoadUtil------------->设置下载相关信息, start...."); |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
|
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
connManager.setMaxTotal(50); |
|||
connManager.setDefaultMaxPerRoute(10); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
//设置超时时间 |
|||
int timeout = 30; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
// 设置重定向策略 |
|||
LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy(); |
|||
//创建自定义的httpclient对象 |
|||
client = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(config).setRedirectStrategy(redirectStrategy).setDefaultSocketConfig(socketConfig).setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36").build(); |
|||
// CloseableHttpClient client = HttpClients.createDefault(); |
|||
|
|||
HttpGet httpGet = new HttpGet(url); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpGet.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"); |
|||
} |
|||
log.debug("DownLoadUtil------------->设置下载相关信息, end...."); |
|||
try { |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
log.debug("DownLoadUtil------------->下载执行,start...."); |
|||
httpGet.setConfig(config); |
|||
response = client.execute(httpGet); |
|||
log.debug("DownLoadUtil------------->下载执行,end...."); |
|||
// 从响应模型中获取响应实体 |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
log.debug("DownLoadUtil------------->响应状态为:" + response.getStatusLine()+",下载请求没问题url:"+url+",read is start ...."); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
responseEntity = response.getEntity(); |
|||
log.debug("DownLoadUtil------------->响应状态为:" + response.getStatusLine()+",下载请求没问题url:"+url+",read is end ...."); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
System.out.println("响应内容长度为:" + responseEntity.getContentLength()); |
|||
} |
|||
}else if(statusLine.getStatusCode() == notFundCode){ |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
|
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
}finally{ |
|||
try { |
|||
responseEntity.getContent().close(); |
|||
response.close(); |
|||
client.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
return html; |
|||
} |
|||
|
|||
public static String httpSSLGet(String url,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
html = httpsslGet(url,headers); |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(30000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
html = httpsslGet(url,headers); |
|||
} |
|||
return html; |
|||
} |
|||
public static String doPostFrom(String url,Map<String, Object> param,Map<String, Object> ... headers){ |
|||
//设置超时时间 |
|||
int timeout = 15; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
// AuthCache authCache = new BasicAuthCache(); |
|||
// authCache.put(proxy, new BasicScheme()); |
|||
// HttpClientContext localContext = HttpClientContext.create(); |
|||
// localContext.setAuthCache(authCache); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
httpBuilder.setUserAgent(ua); |
|||
// HttpClient httpClient = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).setConnectionManager(cm) |
|||
// .setDefaultCredentialsProvider(credsProvider).build(); |
|||
HttpClient httpClient = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).build(); |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpPost.addHeader("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"); |
|||
httpPost.addHeader("accept-Language", "zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpPost.addHeader("content-type", "application/x-www-form-urlencoded"); |
|||
httpPost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"); |
|||
// httpPost.addHeader("Referer", "http://www.neeq.com.cn/rule/Business_rules.html"); |
|||
} |
|||
// 创建请求参数 |
|||
List<NameValuePair> list = new LinkedList<>(); |
|||
for (String key : param.keySet()) { |
|||
BasicNameValuePair param1 = new BasicNameValuePair(key,param.get(key).toString()); |
|||
list.add(param1); |
|||
} |
|||
// 使用URL实体转换工具 |
|||
String html=""; |
|||
try { |
|||
UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8"); |
|||
httpPost.setEntity(entityParam); |
|||
HttpResponse response = httpClient.execute(httpPost); |
|||
// HttpResponse response = httpClient.execute(httpPost,localContext); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
} |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
|
|||
return html; |
|||
|
|||
} |
|||
public static String httpPostForm(String url,Map<String,Object> params,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
html = doPostFrom(url,params); |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(5000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
html = doPostFrom(url,params,headers); |
|||
} |
|||
return html; |
|||
} |
|||
|
|||
public static String dosslPost(String url,String params,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
CloseableHttpClient client = null; |
|||
HttpEntity responseEntity = null; |
|||
CloseableHttpResponse response = null; |
|||
try { |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
//设置超时时间 |
|||
int timeout = 5; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
//创建自定义的httpclient对象 |
|||
client = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(config).setDefaultSocketConfig(socketConfig).build(); |
|||
// CloseableHttpClient client = HttpClients.createDefault(); |
|||
// 2. 创建httppost实例 |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
httpPost.addHeader("Content-Type", "application/json;charset=utf-8"); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpPost.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"); |
|||
} |
|||
|
|||
try { |
|||
httpPost.setEntity(new StringEntity(params,"utf-8")); |
|||
response = client.execute(httpPost); |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
// 从响应模型中获取响应实体 |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
responseEntity = response.getEntity(); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
System.out.println("响应内容长度为:" + responseEntity.getContentLength()); |
|||
} |
|||
}else if(statusLine.getStatusCode() == notFundCode){ |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
|
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
}finally{ |
|||
try { |
|||
responseEntity.getContent().close(); |
|||
response.close(); |
|||
client.close(); |
|||
} catch (UnsupportedOperationException e) { |
|||
e.printStackTrace(); |
|||
} catch (IOException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
} |
|||
|
|||
|
|||
return html; |
|||
} |
|||
public static String dosslPostForm(String url,Map<String, Object> param,Map<String, Object> ... headers) { |
|||
String html=""; |
|||
try { |
|||
//采用绕过验证的方式处理https请求 |
|||
SSLContext sslcontext = createIgnoreVerifySSL(); |
|||
|
|||
// 设置协议http和https对应的处理socket链接工厂的对象 |
|||
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() |
|||
.register("http", PlainConnectionSocketFactory.INSTANCE) |
|||
.register("https", new SSLConnectionSocketFactory(sslcontext)) |
|||
.build(); |
|||
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); |
|||
HttpClients.custom().setConnectionManager(connManager); |
|||
//设置超时时间 |
|||
int timeout = 5; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
//创建自定义的httpclient对象 |
|||
CloseableHttpClient client = HttpClients.custom().setConnectionManager(connManager).setDefaultRequestConfig(config).setDefaultSocketConfig(socketConfig).build(); |
|||
// CloseableHttpClient client = HttpClients.createDefault(); |
|||
// 2. 创建httppost实例 |
|||
HttpPost httpPost = new HttpPost(url); |
|||
// httpPost.setConfig(reqConfig); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpPost.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpPost.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpPost.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
httpPost.addHeader("content-type", "application/x-www-form-urlencoded"); |
|||
httpPost.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"); |
|||
} |
|||
|
|||
// 创建请求参数 |
|||
List<NameValuePair> list = new LinkedList<>(); |
|||
for (String key : param.keySet()) { |
|||
BasicNameValuePair param1 = new BasicNameValuePair(key,param.get(key).toString()); |
|||
list.add(param1); |
|||
} |
|||
// 使用URL实体转换工具 |
|||
try { |
|||
UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(list, "UTF-8"); |
|||
httpPost.setEntity(entityParam); |
|||
HttpResponse response = client.execute(httpPost); |
|||
// HttpResponse response = httpClient.execute(httpPost,localContext); |
|||
// 从响应模型中获取响应实体 |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
} |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
|
|||
|
|||
return html; |
|||
} |
|||
public static String httpSSLPostForm(String url,Map<String, Object> params,Map<String, Object> ...headers) { |
|||
String html=""; |
|||
try { |
|||
html = dosslPostForm(url,params,headers); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(30000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
try { |
|||
html = dosslPostForm(url,params,headers); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
} |
|||
return html; |
|||
} |
|||
public static String httpSSLPost(String url,String params,Map<String, Object> ...headers) { |
|||
String html=""; |
|||
try { |
|||
html = dosslPost(url,params,headers); |
|||
} catch (Throwable e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
int i = 1; |
|||
while(true){ |
|||
if(html.contains("Download failed error is:")){ |
|||
log.error("DownLoadUtil------------->download is failure,url is:"+url); |
|||
DateUtil.sleep(30000); |
|||
i++; |
|||
}else{ |
|||
break; |
|||
} |
|||
if(i > 5){ |
|||
break; |
|||
} |
|||
try { |
|||
html = dosslPost(url,params,headers); |
|||
} catch (Throwable e) { |
|||
e.printStackTrace(); |
|||
// TODO: handle exception |
|||
html = "Download failed error is:Exception!"; |
|||
} |
|||
} |
|||
return html; |
|||
} |
|||
|
|||
/** |
|||
* 模拟客户端get请求 |
|||
* @param url 模拟请求得url |
|||
* @param headers 头部信息,没有可以不传 |
|||
* @return |
|||
*/ |
|||
public static String doGet(String url,Map<String, Object> ... headers){ |
|||
//设置超时时间 |
|||
int timeout = 15; |
|||
RequestConfig config = RequestConfig.custom(). |
|||
setConnectTimeout(timeout * 1000). |
|||
setConnectionRequestTimeout(timeout * 1000). |
|||
setSocketTimeout(timeout * 1000).build(); |
|||
SocketConfig socketConfig = SocketConfig.custom() |
|||
.setSoKeepAlive(false) |
|||
.setSoLinger(1) |
|||
.setSoReuseAddress(true) |
|||
.setSoTimeout(10000) |
|||
.setTcpNoDelay(true).build(); |
|||
HttpClientBuilder httpBuilder = HttpClientBuilder.create(); |
|||
httpBuilder.setUserAgent(ua); |
|||
HttpClient httpClient = httpBuilder.setDefaultSocketConfig(socketConfig).setDefaultRequestConfig(config).build(); |
|||
HttpGet httpGet = new HttpGet(url); |
|||
if(headers != null && headers.length > 0){ |
|||
Map<String, Object> tempHeaders = headers[0]; |
|||
for (String key : tempHeaders.keySet()) { |
|||
httpGet.setHeader(key,tempHeaders.get(key).toString()); |
|||
} |
|||
}else{ |
|||
httpGet.setHeader("Accept", "application/json, text/javascript, */*; q=0.01"); |
|||
httpGet.setHeader("Accept-Language","zh-CN,zh;q=0.9,en;q=0.8"); |
|||
} |
|||
String html=""; |
|||
try { |
|||
int notFundCode = 404; |
|||
int successCode = 200; |
|||
HttpResponse response = httpClient.execute(httpGet); |
|||
// 从响应模型中获取响应实体 |
|||
HttpEntity responseEntity = response.getEntity(); |
|||
StatusLine statusLine = response.getStatusLine(); |
|||
System.out.println("响应状态为:" + response.getStatusLine()); |
|||
if(statusLine.getStatusCode() == successCode){ |
|||
if (responseEntity != null) { |
|||
html=EntityUtils.toString(responseEntity,"utf-8"); |
|||
if(html.equals("")){ |
|||
html = "Download failed error is:reslut is null"; |
|||
} |
|||
} |
|||
}else if(statusLine.getStatusCode() == notFundCode){ |
|||
html = "<h2>页面404,正常结束请求即可</h2>"; |
|||
}else{ |
|||
throw new Exception("请求错误,code码为:"+statusLine.getStatusCode()); |
|||
} |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
html = "Download failed error is:"+ThrowMessageUtil.getErrmessage(e); |
|||
} |
|||
return html; |
|||
|
|||
} |
|||
public static void main(String[] args) throws Exception { |
|||
|
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import java.security.MessageDigest; |
|||
import java.security.NoSuchAlgorithmException; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2023年3月10日 |
|||
* @description |
|||
*/ |
|||
public class EncryptionUtil { |
|||
public static String md5(String text) { |
|||
try { |
|||
MessageDigest md = MessageDigest.getInstance("MD5"); |
|||
md.update(text.getBytes()); |
|||
byte[] bytes = md.digest(); |
|||
StringBuilder sb = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
sb.append(String.format("%02x", b & 0xff)); |
|||
} |
|||
return sb.toString(); |
|||
} catch (NoSuchAlgorithmException e) { |
|||
e.printStackTrace(); |
|||
return null; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import java.io.FileWriter; |
|||
import java.io.IOException; |
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.HashSet; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.Set; |
|||
|
|||
/** |
|||
* 文件工具类 |
|||
* @author jian.mao |
|||
* @date 2023年7月14日 |
|||
* @description |
|||
*/ |
|||
public class FileUtil { |
|||
|
|||
/** |
|||
* 数据写入文件 |
|||
* @param Path 文件路径 |
|||
* @param result 数据 |
|||
* @throws IOException |
|||
*/ |
|||
public static void writeFile(String path,String result){ |
|||
try { |
|||
FileWriter fw = new FileWriter(path,true); |
|||
fw.write(result+"\n"); |
|||
fw.flush(); |
|||
fw.close(); |
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,53 @@ |
|||
package com.bw.asr.utils; |
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.alibaba.fastjson.JSONException; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
/** |
|||
* @author:jinming |
|||
* @className:GPTResultParseUtil |
|||
* @version:1.0 |
|||
* @description: |
|||
* @Date:2024/6/28 10:11 |
|||
*/ |
|||
public class GPTResultParseUtil { |
|||
public static Map<String, Object> parseGPTResult(Map<String, Object> output, String gptContent) { |
|||
Map<String, Object> jsonResult = new HashMap<>(); |
|||
try { |
|||
// 替换```json, ``` 和 \n |
|||
String jsonContent = gptContent.replace("```json", "").replace("```", "").replace("\n", ""); |
|||
JSONObject jsonGPT = JSON.parseObject(jsonContent); |
|||
|
|||
for (String key : output.keySet()) { |
|||
if (jsonGPT.containsKey(key)) { |
|||
jsonResult.put(key, jsonGPT.get(key)); |
|||
} |
|||
} |
|||
return jsonResult; |
|||
} catch (JSONException e) { |
|||
try { |
|||
// 直接解析失败,使用正则表达式匹配外层的 {} |
|||
Pattern pattern = Pattern.compile("\\{.*\\}", Pattern.DOTALL); |
|||
Matcher matcher = pattern.matcher(gptContent.replace("\n", "")); |
|||
if (matcher.find()) { |
|||
JSONObject jsonGPT = JSON.parseObject(matcher.group()); |
|||
for (String key : output.keySet()) { |
|||
if (jsonGPT.containsKey(key)) { |
|||
jsonResult.put(key, jsonGPT.get(key)); |
|||
} |
|||
} |
|||
return jsonResult; |
|||
} else { |
|||
return null; |
|||
} |
|||
} catch (Exception ex) { |
|||
ex.printStackTrace(); |
|||
return null; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.bw.asr.entity.Constants; |
|||
|
|||
/** |
|||
* json工具 |
|||
* @author jian.mao |
|||
* @date 2023年7月10日 |
|||
* @description |
|||
*/ |
|||
public class JsonUtil { |
|||
|
|||
/** |
|||
* 校验字符串是list/map/str |
|||
* @param jsonString |
|||
* @return |
|||
*/ |
|||
public static String checkJsonType(String jsonString) { |
|||
try { |
|||
JSONObject.parseObject(jsonString); |
|||
return Constants.MAP_TYPE; |
|||
} catch (Exception e) { |
|||
try { |
|||
JSONObject.parseArray(jsonString); |
|||
return Constants.LIST_TYPE; |
|||
} catch (Exception ex) { |
|||
return Constants.STRING_TYPE; |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,33 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import java.security.MessageDigest; |
|||
|
|||
/** |
|||
* 其他工具类 |
|||
* @author jian.mao |
|||
* @date 2023年9月19日 |
|||
* @description |
|||
*/ |
|||
public class OtherUtils { |
|||
|
|||
|
|||
|
|||
public static String getMd5(String string) { |
|||
try { |
|||
MessageDigest md5 = MessageDigest.getInstance("MD5"); |
|||
byte[] bs = md5.digest(string.getBytes("UTF-8")); |
|||
StringBuilder sb = new StringBuilder(40); |
|||
for (byte x : bs) { |
|||
if ((x & 0xff) >> 4 == 0) { |
|||
sb.append("0").append(Integer.toHexString(x & 0xff)); |
|||
} else { |
|||
sb.append(Integer.toHexString(x & 0xff)); |
|||
} |
|||
} |
|||
return sb.toString(); |
|||
} catch (Exception e) { |
|||
|
|||
return "nceaform" + System.currentTimeMillis(); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,18 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import java.util.Map; |
|||
import java.util.concurrent.LinkedBlockingDeque; |
|||
|
|||
/** |
|||
* @author:jinming |
|||
* @className:QueueUtil |
|||
* @version:1.0 |
|||
* @description: |
|||
* @Date:2023/7/13 15:00 |
|||
*/ |
|||
public class QueueUtil { |
|||
|
|||
public static LinkedBlockingDeque<Map<String, Object>> taskQueue = new LinkedBlockingDeque<Map<String, Object>>(); |
|||
|
|||
public static LinkedBlockingDeque<String> sendQueue = new LinkedBlockingDeque<String>(); |
|||
} |
@ -0,0 +1,46 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import com.alibaba.fastjson.JSONObject; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.kafka.core.KafkaTemplate; |
|||
import org.springframework.kafka.support.SendResult; |
|||
import org.springframework.stereotype.Component; |
|||
import org.springframework.util.concurrent.ListenableFuture; |
|||
import org.springframework.util.concurrent.ListenableFutureCallback; |
|||
|
|||
/** |
|||
* @PROJECT_NAME: companybusinesscrawl |
|||
* @DESCRIPTION:SpringBootKafka 工具类 |
|||
* @AUTHOR: ying.zhao |
|||
* @DATE: 2023/4/6 11:09 |
|||
*/ |
|||
@Slf4j |
|||
@Component |
|||
public class SpringBootKafka { |
|||
@Autowired |
|||
private KafkaTemplate<String, Object> kafkaTemplate; |
|||
/** |
|||
* 自定义topicKafkaTemplate |
|||
*/ |
|||
/** |
|||
* public static final String TOPIC = "companyBussTest"; |
|||
**/ |
|||
public void send(String topic, String message) { |
|||
//发送消息 |
|||
ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, message); |
|||
future.addCallback(new ListenableFutureCallback<SendResult<String, Object>>() { |
|||
@Override |
|||
public void onFailure(Throwable throwable) { |
|||
//发送失败的处理 |
|||
log.info(topic + " - 生产者 发送消息失败:" + throwable.getMessage()); |
|||
} |
|||
|
|||
@Override |
|||
public void onSuccess(SendResult<String, Object> stringObjectSendResult) { |
|||
//成功的处理 |
|||
log.info(topic + " - 生产者 发送消息成功" ); |
|||
} |
|||
}); |
|||
} |
|||
} |
@ -0,0 +1,23 @@ |
|||
package com.bw.asr.utils; |
|||
|
|||
import java.io.PrintWriter; |
|||
import java.io.StringWriter; |
|||
|
|||
/** |
|||
* @author jian.mao |
|||
* @date 2023年3月22日 |
|||
* @description |
|||
*/ |
|||
public class ThrowMessageUtil { |
|||
|
|||
/** |
|||
* 获取异常信息 |
|||
* @param t |
|||
* @return |
|||
*/ |
|||
public static String getErrmessage(Throwable t){ |
|||
StringWriter stringWriter=new StringWriter(); |
|||
t.printStackTrace(new PrintWriter(stringWriter,true)); |
|||
return stringWriter.getBuffer().toString(); |
|||
} |
|||
} |
@ -0,0 +1,106 @@ |
|||
logging: |
|||
level: |
|||
root: info |
|||
path: ./logs |
|||
server: |
|||
port: 8016 |
|||
servlet: |
|||
context-path: /asr |
|||
tomcat: |
|||
uri-encoding: utf-8 |
|||
max-connections: 20000 |
|||
max-http-form-post-size: 1 |
|||
max-threads: 1000 |
|||
spring: |
|||
application: |
|||
name: 百度asr |
|||
kafka: |
|||
bootstrap-servers: node-01:19092,node-02:19092,node-03:19092 |
|||
producer: |
|||
retries: 0 |
|||
#当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。 |
|||
batch-size: 16384 |
|||
# 设置生产者内存缓冲区的大小。 |
|||
buffer-memory: 33554432 |
|||
# 键的序列化方式 |
|||
key-serializer: org.apache.kafka.common.serialization.StringSerializer |
|||
# 值的序列化方式 |
|||
value-serializer: org.apache.kafka.common.serialization.StringSerializer |
|||
# acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。 |
|||
# acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。 |
|||
# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。 |
|||
acks: 1 |
|||
consumer: |
|||
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D |
|||
auto-commit-interval: 1S |
|||
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理: |
|||
# latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录) |
|||
# earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录 |
|||
auto-offset-reset: earliest |
|||
# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量 |
|||
enable-auto-commit: true |
|||
# 键的反序列化方式 |
|||
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer |
|||
# 值的反序列化方式 |
|||
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer |
|||
#消费组 |
|||
group-id: test4 |
|||
#消费者并发线程数 |
|||
concurrency: 4 |
|||
#超时时间 |
|||
max-poll-interval-ms: 60000 |
|||
listener: |
|||
# 在侦听器容器中运行的线程数。 |
|||
#concurrency: 5 |
|||
#listner负责ack,每调用一次,就立即commit |
|||
#ack-mode: manual_immediate |
|||
missing-topics-fatal: false |
|||
redis: |
|||
host: node-01 |
|||
port: 6379 |
|||
timeout: 10000 |
|||
database: 5 |
|||
jedis: |
|||
pool: |
|||
max-active: 8 # 连接池最大连接数(使用负值表示没有限制) |
|||
max-wait: 800 # 连接池最大阻塞等待时间(使用负值表示没有限制) |
|||
max-idle: 8 # 连接池中的最大空闲连接 |
|||
min-idle: 2 # 连接池中的最小空闲连接 |
|||
boot: |
|||
admin: |
|||
client: |
|||
url: http://192.168.0.44:8001 |
|||
instance: |
|||
service-base-url: http://192.168.0.44:8016 |
|||
|
|||
management: |
|||
endpoints: |
|||
web: |
|||
exposure: |
|||
include: "*" |
|||
endpoint: |
|||
health: |
|||
show-details: always |
|||
health: |
|||
elasticsearch: |
|||
enabled: false |
|||
zookeeper: |
|||
connection-string: node-01:12181,node-02:12181,node-03:12181 |
|||
publish-node: /analyze |
|||
customize-kafka: |
|||
producer: |
|||
topic: analyze |
|||
task: |
|||
create-task-queue-path: ../data/createTaskQueue.txt |
|||
query-task-queue-path: ../data/queryTaskQueue.txt |
|||
threadPool: |
|||
corePoolSize: 5 |
|||
maximumPoolSize: 20 |
|||
keepAliveTime: 60 |
|||
queueSize: 100 |
|||
apiconfig: |
|||
apiKey: iHFODisMSBnyZzoyXtnz4eWM |
|||
secretKey: d5DUgLrm2bBmgYpkcV8bKpkdxB1pchvL |
|||
tokenUrl: https://aip.baidubce.com/oauth/2.0/token |
|||
createUrl: https://aip.baidubce.com/rpc/2.0/aasr/v1/create |
|||
queryUrl: https://aip.baidubce.com/rpc/2.0/aasr/v1/query |
@ -0,0 +1,36 @@ |
|||
<configuration> |
|||
<!-- 属性文件:在properties文件中找到对应的配置项 --> |
|||
<springProperty scope="context" name="logging.path" source="logging.path"/> |
|||
<springProperty scope="context" name="logging.level" source="logging.level.com.bfd"/> |
|||
<!-- 默认的控制台日志输出,一般生产环境都是后台启动,这个没太大作用 --> |
|||
<!--<appender name="STDOUT" |
|||
class="ch.qos.logback.core.ConsoleAppender"> |
|||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> |
|||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %line %-5level %logger{50} - %msg%n</Pattern> |
|||
</encoder> |
|||
</appender>--> |
|||
|
|||
<appender name="GLMAPPER-LOGGERONE" |
|||
class="ch.qos.logback.core.rolling.RollingFileAppender"> |
|||
<append>true</append> |
|||
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"> |
|||
<level>${logging.level}</level> |
|||
</filter> |
|||
<file> |
|||
${logging.path}/baidu_asrInfo.log |
|||
</file> |
|||
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> |
|||
<FileNamePattern>${logging.path}/baidu_asrInfo.log.%d{yyyy-MM-dd}</FileNamePattern> |
|||
<MaxHistory>7</MaxHistory> |
|||
</rollingPolicy> |
|||
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> |
|||
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %line %-5level %logger{50} - %msg%n</pattern> |
|||
<charset>UTF-8</charset> |
|||
</encoder> |
|||
</appender> |
|||
|
|||
<root level="info"> |
|||
<appender-ref ref="GLMAPPER-LOGGERONE"/> |
|||
<!--<appender-ref ref="STDOUT"/>--> |
|||
</root> |
|||
</configuration> |
@ -0,0 +1,38 @@ |
|||
package com.bw; |
|||
|
|||
import junit.framework.Test; |
|||
import junit.framework.TestCase; |
|||
import junit.framework.TestSuite; |
|||
|
|||
/** |
|||
* Unit test for simple App. |
|||
*/ |
|||
public class AppTest |
|||
extends TestCase |
|||
{ |
|||
/** |
|||
* Create the test case |
|||
* |
|||
* @param testName name of the test case |
|||
*/ |
|||
public AppTest( String testName ) |
|||
{ |
|||
super( testName ); |
|||
} |
|||
|
|||
/** |
|||
* @return the suite of tests being tested |
|||
*/ |
|||
public static Test suite() |
|||
{ |
|||
return new TestSuite( AppTest.class ); |
|||
} |
|||
|
|||
/** |
|||
* Rigourous Test :-) |
|||
*/ |
|||
public void testApp() |
|||
{ |
|||
assertTrue( true ); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue