Commit c6f65f1e authored by 曹军's avatar 曹军

上传定时任务,优化代码

parent 87d09c18
package com.bme.access.upload.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//设置一个依据定时任务个数的线程池
TaskScheduler scheduler = this.taskScheduler();
taskRegistrar.setTaskScheduler(scheduler);
}
@Bean(destroyMethod = "shutdown")
public ThreadPoolTaskScheduler taskScheduler() {
//设置一个依据定时任务个数的线程池
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(18);
taskScheduler.setThreadNamePrefix("task-");
taskScheduler.setAwaitTerminationSeconds(60);
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return taskScheduler;
}
}
\ No newline at end of file
......@@ -25,7 +25,7 @@ public class UploadDataNewTask {
/**
* 场内运输车辆信息-添加
*/
@Scheduled(cron = "0 0/2 * * * *")
@Scheduled(cron = "0 0/10 * * * *")
public void uploadInFactoryTransportVehicleInfo() {
log.info("场内运输车辆信息-添加");
try {
......
......@@ -19,4 +19,6 @@ import java.util.Map;
public interface TransportVehicleInfoMapper {
List<TransportVehicleInfoUrl> getUploadTransportVehicleInfo(String uploadTime);
List<TransportVehicleInfoUrl> getUploadTransportVehicleInfoWithNumberPlate(String numberPlate);
}
\ No newline at end of file
......@@ -61,6 +61,7 @@ public class TransportVehicleInfoService {
log.info("执行车辆信息上传线程");
List<TransportVehicleInfoUrl> uploadTransportVehicleInfoList = transportVehicleInfoMapper.getUploadTransportVehicleInfo(uploadTime);
log.info("执行车辆信息上传线程,size={}", uploadTransportVehicleInfoList.size());
if (!CollectionUtils.isEmpty(uploadTransportVehicleInfoList)) {
try {
loginService.login();
......@@ -70,6 +71,7 @@ public class TransportVehicleInfoService {
}
}
for (TransportVehicleInfoUrl transportVehicleInfoUrl : uploadTransportVehicleInfoList) {
log.info("在上传车辆信息车牌={}", transportVehicleInfoUrl.getNumberPlate());
if (StringUtils.isEmpty(transportVehicleInfoUrl.getNumberPlate())) {
log.info("车辆上传车牌异常={}", JSON.toJSONString(transportVehicleInfoUrl));
continue;
......@@ -97,4 +99,40 @@ public class TransportVehicleInfoService {
dataUploadTimeMapper.updateUploadTimeByType(uploadTransportVehicleInfoList.get(uploadTransportVehicleInfoList.size() - 1).getCreateTime(), 102);
}
}
public void updateVehicle(String numberPlate) {
List<TransportVehicleInfoUrl> uploadTransportVehicleInfoList = transportVehicleInfoMapper.getUploadTransportVehicleInfoWithNumberPlate(numberPlate);
if (!CollectionUtils.isEmpty(uploadTransportVehicleInfoList)) {
try {
loginService.login();
} catch (Exception e) {
log.error("更新token失败:{}", e.getMessage());
return;
}
}
for (TransportVehicleInfoUrl transportVehicleInfoUrl : uploadTransportVehicleInfoList) {
if (StringUtils.isEmpty(transportVehicleInfoUrl.getNumberPlate())) {
log.info("车辆上传车牌异常={}", JSON.toJSONString(transportVehicleInfoUrl));
continue;
}
UploadTransportVehicleInfo uploadVehicleInfo = beanConverter.convertTransportVehicleInfo(transportVehicleInfoUrl);
try {
String bodyJson = JSONObject.toJSONString(uploadVehicleInfo);
HttpResponse httpResponse = HttpUtils.sendPost(ADD_VEHICLE_URL, null, null, bodyJson);
Thread.sleep(50);
} catch (Exception e) {
log.info("发生连接失败,重传");
try {
loginService.login();
String bodyJson = JSONObject.toJSONString(uploadVehicleInfo);
HttpUtils.sendPost(ADD_VEHICLE_URL, null, null, bodyJson);
Thread.sleep(50);
} catch (Exception ex) {
log.info("再次失败,将此数据存于车辆失败表uploadVehicleInfo={}", JSON.toJSONString(uploadVehicleInfo));
transportVehicleInfoFailMapper.insertFail(transportVehicleInfoUrl.getNumberPlate());
}
}
}
}
}
......@@ -4,11 +4,19 @@ import net.coobird.thumbnailator.Thumbnails;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Encoder;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Base64;
import java.util.Iterator;
/**
* description:
......@@ -192,6 +200,54 @@ public class Base64Utils {
return null;
}
public static String imgToBase64WithCompress(String imageUrl) {
float quality = 0.8f;
int targetSizeKB = 600;
String encoder = "data:image/jpg;base64,";
try {
// 下载图片
BufferedImage originalImage = downloadImage(imageUrl);
// 处理透明背景
BufferedImage processedImage = handleTransparency(originalImage);
// 压缩图片
byte[] compressedImageBytes = compressImage(processedImage, quality, targetSizeKB);
URL url = new URL(imageUrl);
// 打开链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 设置请求方式为"GET"
conn.setRequestMethod("GET");
// 超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
// 通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
// 创建一个Buffer字符串
byte[] buffer = new byte[1024];
// 每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
// 使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
// 用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
// 关闭输入流
inStream.close();
BASE64Encoder base64Encoder = new BASE64Encoder();
encoder = encoder + base64Encoder.encode(compressedImageBytes).replace("\r\n", "").trim();
return encoder;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String encodeImageUrl(String originalUrl) {
try {
// 1. 分割URL为协议+主机部分和路径部分
......@@ -240,4 +296,59 @@ public class Base64Utils {
byte[] bytes = getByteImgByUrl("https://q1.itc.cn/q_70/images03/20240430/59fe8596e4cb4824a6f27315328a3559.jpeg");
System.out.println(bytes);
}
private static BufferedImage downloadImage(String imageUrl) throws IOException {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
try (InputStream inputStream = connection.getInputStream()) {
return ImageIO.read(inputStream);
}
}
private static BufferedImage handleTransparency(BufferedImage image) {
// 检查图片是否有透明通道
if (image.getColorModel().hasAlpha()) {
// 创建一个白色背景的新图片
BufferedImage result = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = result.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return result;
}
return image;
}
private static byte[] compressImage(BufferedImage image, float quality, int targetSizeKB) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("JPEG");
if (!writers.hasNext()) {
throw new IllegalStateException("No JPEG writer found");
}
ImageWriter writer = writers.next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionQuality(quality);
try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream)) {
writer.setOutput(ios);
writer.write(null, new IIOImage(image, null, null), writeParam);
}
byte[] imageBytes = outputStream.toByteArray();
int targetSize = targetSizeKB * 1024;
// 如果图片大小仍超过目标大小,递归降低质量
if (imageBytes.length > targetSize && quality > 0.1f) {
float newQuality = Math.max(quality - 0.1f, 0.1f);
return compressImage(image, newQuality, targetSizeKB);
}
return imageBytes;
}
}
\ No newline at end of file
......@@ -30,14 +30,14 @@ public class BeanConverter {
InFactoryTransportVehicleInfo info = new InFactoryTransportVehicleInfo();
info.setCarNo(item.getNumberPlate());
if (StringUtils.isNotBlank(item.getOnBoardList())) {
info.setVehicleListImg(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getOnBoardList())));
info.setVehicleListImg(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getOnBoardList())));
}
if (StringUtils.isNotBlank(item.getDrivingLicense())) {
info.setDrivingLicenseImg(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getDrivingLicense())));
info.setDrivingLicenseImg(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getDrivingLicense())));
}
info.setSensorCatalyticConverterImg(null);
if (StringUtils.isNotBlank(item.getVehicleImage())) {
info.setCarImg(Base64Utils.imgToBase64(item.getVehicleImage()));
info.setCarImg(Base64Utils.imgToBase64WithCompress(item.getVehicleImage()));
}
if (item.getVehicleEmissions() == null) {
info.setEmissionStandard("X");
......@@ -131,10 +131,10 @@ public class BeanConverter {
}
if (StringUtils.isNotBlank(item.getDrivingLicenseImage())) {
info.setDrivingLicenseImg(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getDrivingLicenseImage())));
info.setDrivingLicenseImg(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getDrivingLicenseImage())));
}
if (StringUtils.isNotBlank(item.getOnBoardList())) {
info.setVehicleListImg(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getOnBoardList())));
info.setVehicleListImg(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getOnBoardList())));
}
info.setVehicleModel(item.getModel());
info.setVehicleType(item.getVehicleType());
......@@ -170,11 +170,11 @@ public class BeanConverter {
info.setEngineManufacturer(item.getEngineVendor());
info.setEngineModel(item.getEngineModel());
if (StringUtils.isNotBlank(item.getEngineImage())) {
info.setEnginePlaque(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getEngineImage())));
info.setEnginePlaque(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getEngineImage())));
}
info.setEngineSerialNumber(item.getEnvironmentSN());
if (StringUtils.isNotBlank(item.getVehicleLable())) {
info.setEnvIronMentalLabel(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getVehicleLable())));
info.setEnvIronMentalLabel(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getVehicleLable())));
}
info.setEquipmentModel(item.getMechanicalModel());
info.setEquipmentType(item.getMechanicalType());
......@@ -184,7 +184,7 @@ public class BeanConverter {
info.setOwner(item.getOwener());
info.setPin(item.getMechanicalEnvironment());
if (StringUtils.isNotBlank(item.getDeviceImage())) {
info.setVehiclePlaque(Base64Utils.imgToBase64(Base64Utils.encodeImageUrl(item.getDeviceImage())));
info.setVehiclePlaque(Base64Utils.imgToBase64WithCompress(Base64Utils.encodeImageUrl(item.getDeviceImage())));
}
info.setMachMfr(null);
info.setEngNetPower(null);
......
package com.bme.access.upload.module.utils;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.Iterator;
public class ImageCompressor {
public static String compressAndConvertToBase64(String imageUrl) throws IOException {
float quality = 0.8f;
int targetSizeKB = 800;
// 下载图片
BufferedImage originalImage = downloadImage(imageUrl);
// 处理透明背景
BufferedImage processedImage = handleTransparency(originalImage);
// 压缩图片
byte[] compressedImageBytes = compressImage(processedImage, quality, targetSizeKB);
// 转换为Base64
return Base64.getEncoder().encodeToString(compressedImageBytes);
}
private static BufferedImage downloadImage(String imageUrl) throws IOException {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
try (InputStream inputStream = connection.getInputStream()) {
return ImageIO.read(inputStream);
}
}
private static BufferedImage handleTransparency(BufferedImage image) {
// 检查图片是否有透明通道
if (image.getColorModel().hasAlpha()) {
// 创建一个白色背景的新图片
BufferedImage result = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = result.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, image.getWidth(), image.getHeight());
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return result;
}
return image;
}
private static byte[] compressImage(BufferedImage image, float quality, int targetSizeKB) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("JPEG");
if (!writers.hasNext()) {
throw new IllegalStateException("No JPEG writer found");
}
ImageWriter writer = writers.next();
ImageWriteParam writeParam = writer.getDefaultWriteParam();
writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writeParam.setCompressionQuality(quality);
try (ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream)) {
writer.setOutput(ios);
writer.write(null, new IIOImage(image, null, null), writeParam);
}
byte[] imageBytes = outputStream.toByteArray();
int targetSize = targetSizeKB * 1024;
// 如果图片大小仍超过目标大小,递归降低质量
if (imageBytes.length > targetSize && quality > 0.1f) {
float newQuality = Math.max(quality - 0.1f, 0.1f);
return compressImage(image, newQuality, targetSizeKB);
}
return imageBytes;
}
}
\ No newline at end of file
package com.bme.access.upload.module.utils;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Base64;
public class TestBase {
public static String convert(String imageUrl) throws Exception {
try (InputStream inputStream = new URL(imageUrl).openStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
// 分块读取图片数据
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
// 转换为Base64字符串
return Base64.getEncoder().encodeToString(outputStream.toByteArray());
}
}
public static void main(String[] args) throws Exception {
String url = "http://visimg.bmetech.com/access/control/146/in_and_out_%E7%9A%96N79079_inOutImage_20250701173146.jpg";
System.out.println("=============="); // 输出Base64字符串
System.out.println("data:image/jpeg;base64,"+convert(url)); // 输出Base64字符串
System.out.println("=============="); // 输出Base64字符串
}
}
......@@ -9,16 +9,19 @@ import com.bme.access.upload.model.InAndOutDateUrl;
import com.bme.access.upload.model.MaterialInfo;
import com.bme.access.upload.model.TransportDate;
import com.bme.access.upload.module.service.InFactoryTransportVehicleInfoService;
import com.bme.access.upload.module.service.TransportVehicleInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Objects;
@RestController
......@@ -32,6 +35,8 @@ public class TestController {
@Autowired
private InFactoryTransportVehicleInfoService inFactoryTransportVehicleInfoService;
@Resource
private TransportVehicleInfoService transportVehicleInfoService;
@GetMapping("/uploadInAndOutDate")
public CommonResult uploadInAndOutDate() throws Exception {
......@@ -119,9 +124,21 @@ public class TestController {
return materialInfo;
}
/**
* 全量上传场内数据
*/
@GetMapping("/uploadInfactory")
public void uploadInfactory() throws Exception {
inFactoryTransportVehicleInfoService.getAndUploadInFactoryTransportVehicleInfo();
}
/**
* 上传车辆信息
*/
@GetMapping("/updateVehicle")
public void updateVehicle(@Param("numberPlate") String numberPlate){
transportVehicleInfoService.updateVehicle(numberPlate);
}
}
......@@ -34,4 +34,36 @@
WHERE Vehicle_Emissions > 0
AND DTime>#{uploadTime} order by DTime asc
</select>
<select id="getUploadTransportVehicleInfoWithNumberPlate"
resultType="com.bme.access.upload.module.module.TransportVehicleInfoUrl">
SELECT
Number_plate numberPlate,
VIN vin,
Model model,
issue_date issueDate,
nature_use natureUse,
Engine_number engineNumber,
Owener owner,
Address address,
Registration_date registrationDate,
Vehicle_Type vehicleType,
Vehicle_Emissions vehicleEmissions,
Driving_license_Image drivingLicenseImage,
Vehilce_Head_Img vehicleHeadImg ,
VehicleLicense_Verification_Img vehicleLicenseVerificationImg,
VIN_Verification_Img vinVerificationImg,
On_board_list onBoardList,
DTime createTime,
fuel_type fuelType,
plate_color plateColor,
OBD isObd,
registration_time registrationDate,
Engine_Image engineImage,
online_status onlineStatus,
latest_inspection_date latestInspectionDate
FROM
New_Transport_Vehicle_Info_Url
WHERE Number_plate = #{numberPlate}
</select>
</mapper>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment