当前位置: 首页 > news >正文

玩网页游戏的网站企业做推广有几种方式

玩网页游戏的网站,企业做推广有几种方式,世界杯比赛系统网页设计作业,在哪个网站做科目一考试题例子: 举例:假设我们有一个文件上传的uploadFile方法,在这个方法中我们会先执行上传一个文件到分布式文件系统中的方法addMediaFilesToMinIO( ),上传成功后执行文件资源数据入库的addMediaFilesToDb( ),那么这个时候事务应该加在哪…

 例子:

举例:假设我们有一个文件上传的uploadFile方法,在这个方法中我们会先执行上传一个文件到分布式文件系统中的方法addMediaFilesToMinIO( ),上传成功后执行文件资源数据入库的addMediaFilesToDb( ),那么这个时候事务应该加在哪个方法上? 是否会有事务失效的问题?

 问题引出

先说结论:我们只将addMediaFilesToDb方法添加事务控制即可,uploadFile方法上的不需要加@Transactional注解,只给与本地数据库进行网络传输的方法加相应的注解,在开发时,不同的网络传输方法要抽离成单独的方法,但是要注意事务生效的条件。

正常情况下我们在外部uploadFile方法上加会生效,但是直接将@Transactional加在addMediaFilesToDb( )事务会失效,问题出在哪里呢?

原因分析

如果在uploadFile方法上添加@Transactional注解,代理对象执行此方法前会开启事务,如下图:

如果在uploadFile方法上没有@Transactional注解,代理对象执行此方法前不进行事务控制,如下图:

所以判断该方法是否可以事务控制必须保证是通过代理对象调用此方法,且此方法上添加了@Transactional注解。

现在在addMediaFilesToDb方法上添加@Transactional注解,也不会进行事务控制是因为并不是通过代理对象执行的addMediaFilesToDb方法。为了判断在uploadFile方法中去调用addMediaFilesToDb方法是否是通过代理对象去调用,我们可以打断点跟踪。

我们发现在uploadFile方法中去调用addMediaFilesToDb方法不是通过代理对象去调用。

如何解决呢?通过代理对象去调用addMediaFilesToDb方法即可解决。

先将addMediaFilesToDb方法提成接口

 /*** @description 将文件信息添加到文件表* @param companyId  机构id* @param fileMd5  文件md5值* @param uploadFileParamsDto  上传文件的信息* @param bucket  桶* @param objectName 对象名称* @return com.xuecheng.media.model.po.MediaFiles* @author Mr.M* @date 2022/10/12 21:22*/public MediaFiles addMediaFilesToDb(Long companyId,String fileMd5,UploadFileParamsDto uploadFileParamsDto,String bucket,String objectName);

在MediaFileService的实现类中注入MediaFileService的代理对象(注入自己交托spring管理成为代理对象),如下:

@Autowired
MediaFileService currentProxy;

在uploadFile方法中将调用addMediaFilesToDb方法处代码改为

MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);

再次debug可以看到对象为代理对象,并且可以通过加入int i = 1/0,观察十五是否回滚测试addMediaFilesToDb上加事务是否生效。

 

完整代码

package com.xuecheng.media.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.j256.simplemagic.ContentInfo;
import com.j256.simplemagic.ContentInfoUtil;
import com.xuecheng.base.exception.XueChengPlusException;
import com.xuecheng.base.model.PageParams;
import com.xuecheng.base.model.PageResult;
import com.xuecheng.media.mapper.MediaFilesMapper;
import com.xuecheng.media.model.dto.QueryMediaParamsDto;
import com.xuecheng.media.model.dto.UploadFileParamsDto;
import com.xuecheng.media.model.dto.UploadFileResultDto;
import com.xuecheng.media.model.po.MediaFiles;
import com.xuecheng.media.service.MediaFileService;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.io.File;
import java.io.FileInputStream;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;/*** @author Mr.M* @version 1.0* @description TODO* @date 2022/9/10 8:58*/
@Slf4j
@Service
public class MediaFileServiceImpl implements MediaFileService {@AutowiredMediaFilesMapper mediaFilesMapper;@AutowiredMinioClient minioClient;@AutowiredMediaFileService currentProxy;
// 存储普通文件@Value("${minio.bucket.files}")private String bucket_files;
// 存储视频文件@Value("${minio.bucket.videofiles}")private String bucket_video;//普通文件桶@Value("${minio.bucket.files}")private String bucket_Files;@Overridepublic PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto) {//构建查询条件对象LambdaQueryWrapper<MediaFiles> queryWrapper = new LambdaQueryWrapper<>();//分页对象Page<MediaFiles> page = new Page<>(pageParams.getPageNo(), pageParams.getPageSize());// 查询数据内容获得结果Page<MediaFiles> pageResult = mediaFilesMapper.selectPage(page, queryWrapper);// 获取数据列表List<MediaFiles> list = pageResult.getRecords();// 获取数据总数long total = pageResult.getTotal();// 构建结果集PageResult<MediaFiles> mediaListResult = new PageResult<>(list, total, pageParams.getPageNo(), pageParams.getPageSize());return mediaListResult;}//获取文件默认存储目录路径 年/月/日private String getDefaultFolderPath() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String folder = sdf.format(new Date()).replace("-", "/") + "/";return folder;}//获取文件的md5private String getFileMd5(File file) {try (FileInputStream fileInputStream = new FileInputStream(file)) {String fileMd5 = DigestUtils.md5Hex(fileInputStream);return fileMd5;} catch (Exception e) {e.printStackTrace();return null;}}/*** 根据扩展名获取MimeType* @param extension* @return*/private String getMimeType(String extension) {if (extension == null) {extension = "";}//根据扩展名取出mimeTypeContentInfo extensionMatch = ContentInfoUtil.findExtensionMatch(extension);//通用mimeType,字节流String mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE;if (extensionMatch != null) {mimeType = extensionMatch.getMimeType();}return mimeType;}/*** 将文件上传到minio* @param localFilePath 文件地址* @param bucket        桶* @param objectName    对象名称* @return void* @description 将文件写入minIO* @author Mr.M* @date 2022/10/12 21:22*/public boolean addMediaFilesToMinIO(String localFilePath, String mimeType, String bucket, String objectName) {try {UploadObjectArgs testbucket = UploadObjectArgs.builder().bucket(bucket).object(objectName).filename(localFilePath).contentType(mimeType).build();minioClient.uploadObject(testbucket);log.debug("上传文件到minio成功,bucket:{},objectName:{}", bucket, objectName);System.out.println("上传成功");return true;} catch (Exception e) {e.printStackTrace();log.error("上传文件到minio出错,bucket:{},objectName:{},错误原因:{}", bucket, objectName, e.getMessage(), e);XueChengPlusException.cast("上传文件到文件系统失败");}return false;}/*** @param companyId           机构id* @param fileMd5             文件md5值* @param uploadFileParamsDto 上传文件的信息* @param bucket              桶* @param objectName          对象名称* @return com.xuecheng.media.model.po.MediaFiles* @description 将文件信息添加到文件表* @author Mr.M* @date 2022/10/12 21:22*/@Override@Transactional  // 在这里加注解public MediaFiles addMediaFilesToDb(Long companyId, String fileMd5, UploadFileParamsDto uploadFileParamsDto, String bucket, String objectName) {//从数据库查询文件MediaFiles mediaFiles = mediaFilesMapper.selectById(fileMd5);if (mediaFiles == null) {mediaFiles = new MediaFiles();//拷贝基本信息BeanUtils.copyProperties(uploadFileParamsDto, mediaFiles);mediaFiles.setId(fileMd5);mediaFiles.setFileId(fileMd5);mediaFiles.setCompanyId(companyId);mediaFiles.setUrl("/" + bucket + "/" + objectName);mediaFiles.setBucket(bucket);mediaFiles.setFilePath(objectName);mediaFiles.setCreateDate(LocalDateTime.now());mediaFiles.setAuditStatus("002003");mediaFiles.setStatus("1");//保存文件信息到文件表int insert = mediaFilesMapper.insert(mediaFiles);if (insert < 0) {log.error("保存文件信息到数据库失败,{}", mediaFiles.toString());XueChengPlusException.cast("保存文件信息失败");return null;}log.debug("保存文件信息到数据库成功,{}", mediaFiles.toString());}return mediaFiles;}/*** 上传文件** @param companyId           机构id* @param uploadFileParamsDto 上传文件信息* @param localFilePath       文件磁盘路径* @return*/
//    @Transactional 不要给这个方法加事务注解,细化到数据库传输方法加@Overridepublic UploadFileResultDto uploadFile(Long companyId, UploadFileParamsDto uploadFileParamsDto, String localFilePath) {File file = new File(localFilePath);if (!file.exists()) {XueChengPlusException.cast("文件不存在");}//文件名称String filename = uploadFileParamsDto.getFilename();//文件扩展名String extension = filename.substring(filename.lastIndexOf("."));//文件mimeTypeString mimeType = getMimeType(extension);//文件的md5值String fileMd5 = getFileMd5(file);//文件的默认目录String defaultFolderPath = getDefaultFolderPath();//存储到minio中的对象名(带目录)String objectName = defaultFolderPath + fileMd5 + extension;//将文件上传到minioboolean result = addMediaFilesToMinIO(localFilePath, mimeType, bucket_files, objectName);if (!result){XueChengPlusException.cast("上传文件失败!");}//文件大小uploadFileParamsDto.setFileSize(file.length());//将文件信息存储到数据库MediaFiles mediaFiles = currentProxy.addMediaFilesToDb(companyId, fileMd5, uploadFileParamsDto, bucket_files, objectName);if (null==mediaFiles){XueChengPlusException.cast("文件上传后保存信息失败");}//准备返回数据UploadFileResultDto uploadFileResultDto = new UploadFileResultDto();BeanUtils.copyProperties(mediaFiles, uploadFileResultDto);return uploadFileResultDto;}
}

结论

       在使用事务注解的时候要考虑与三方等网络传输的效率等问题,正确的使用事务。


文章转载自:
http://elyseeologist.sfrw.cn
http://lubberland.sfrw.cn
http://pearlash.sfrw.cn
http://biparietal.sfrw.cn
http://superglacial.sfrw.cn
http://roadrunner.sfrw.cn
http://announce.sfrw.cn
http://repique.sfrw.cn
http://jacksie.sfrw.cn
http://redrop.sfrw.cn
http://chickee.sfrw.cn
http://handfasting.sfrw.cn
http://funipendulous.sfrw.cn
http://caudated.sfrw.cn
http://tetragrammaton.sfrw.cn
http://revanchist.sfrw.cn
http://worse.sfrw.cn
http://sixteenth.sfrw.cn
http://lacunule.sfrw.cn
http://helluva.sfrw.cn
http://henhouse.sfrw.cn
http://pneumonectomy.sfrw.cn
http://gainfully.sfrw.cn
http://periphonic.sfrw.cn
http://sumba.sfrw.cn
http://chromatolytic.sfrw.cn
http://exorcism.sfrw.cn
http://deutzia.sfrw.cn
http://amrita.sfrw.cn
http://unprepossessed.sfrw.cn
http://cutlas.sfrw.cn
http://gaggery.sfrw.cn
http://steeplebush.sfrw.cn
http://bosom.sfrw.cn
http://unlit.sfrw.cn
http://gelatose.sfrw.cn
http://filch.sfrw.cn
http://spiderman.sfrw.cn
http://patrilinear.sfrw.cn
http://seasat.sfrw.cn
http://easiness.sfrw.cn
http://illusory.sfrw.cn
http://collegium.sfrw.cn
http://nullproc.sfrw.cn
http://coolgardie.sfrw.cn
http://epileptic.sfrw.cn
http://meteorograph.sfrw.cn
http://devoted.sfrw.cn
http://ureterolithotomy.sfrw.cn
http://imprescriptible.sfrw.cn
http://gelong.sfrw.cn
http://paramount.sfrw.cn
http://pastorship.sfrw.cn
http://sinter.sfrw.cn
http://irreducible.sfrw.cn
http://experienced.sfrw.cn
http://nigrostriatal.sfrw.cn
http://inherent.sfrw.cn
http://goldfish.sfrw.cn
http://gallnut.sfrw.cn
http://derealization.sfrw.cn
http://hussar.sfrw.cn
http://cadastration.sfrw.cn
http://hydrogeology.sfrw.cn
http://antisyphilitic.sfrw.cn
http://tolstoyan.sfrw.cn
http://pitchpole.sfrw.cn
http://lough.sfrw.cn
http://tumefy.sfrw.cn
http://dermatropic.sfrw.cn
http://shelving.sfrw.cn
http://decrescent.sfrw.cn
http://megatherm.sfrw.cn
http://linkboy.sfrw.cn
http://dekagram.sfrw.cn
http://decibel.sfrw.cn
http://sequestrator.sfrw.cn
http://electrocution.sfrw.cn
http://orthogonality.sfrw.cn
http://fascia.sfrw.cn
http://rondoletto.sfrw.cn
http://whosis.sfrw.cn
http://knowledgeably.sfrw.cn
http://dislodge.sfrw.cn
http://mantlet.sfrw.cn
http://reembark.sfrw.cn
http://diabolology.sfrw.cn
http://hypothermal.sfrw.cn
http://cornerwise.sfrw.cn
http://marcottage.sfrw.cn
http://reelevate.sfrw.cn
http://hydrobromic.sfrw.cn
http://aegisthus.sfrw.cn
http://promulgator.sfrw.cn
http://zhdanovism.sfrw.cn
http://northwester.sfrw.cn
http://plasticator.sfrw.cn
http://denature.sfrw.cn
http://nonjuring.sfrw.cn
http://extragalactic.sfrw.cn
http://www.hrbkazy.com/news/90961.html

相关文章:

  • 定制网站开发哪个好重庆百度小额贷款有限公司
  • 深圳建设网站推荐优化网站标题是什么意思
  • 定制网站建设公司产品策划推广方案
  • 政府门户网站建设的作用常州网站制作维护
  • 网站上传权限百度联盟是什么
  • 桐乡网站开发常德网站建设公司
  • 深圳正规网站制作哪里好温州网站建设开发
  • 飞鱼crm系统长春网站优化团队
  • 北京市住房和城乡建设部官方网站今日头条新闻最新事件
  • 公司定制网站建设公司淘宝seo优化怎么做
  • 誉重网站建设公司如何做网站设计
  • 在虚拟机中如何做二级域名网站单页网站设计
  • 太原金茂大厦做网站的海口网站关键词优化
  • 龙华做网站联系电话seo怎么推排名
  • 衢州网站开发南昌百度推广公司
  • 亚马逊跨境电商注册深圳谷歌优化seo
  • 杭州网站建设制作联系电话百度一下你就知道搜索引擎
  • 更改wordpress网站的url网络推广公司可不可靠
  • 朋友用我的vps做网站百度站长之家
  • 廊坊做网站关键词挖掘爱站网
  • 做衣服外单网站北京官方seo搜索引擎优化推荐
  • 做代刷网站赚钱不推广公司有哪些公司
  • 网站利于搜索今天重大新闻事件
  • wordpress 微博评论插件优化百度seo技术搜索引擎
  • wordpress 登录小工具泰州网站整站优化
  • 装修公司做宣传在哪个网站高端网站定制开发
  • 无锡网站网页设计培训中小企业网站优化
  • wordpress实现ajax评论上海关键词优化按天计费
  • 公众号开发费用网站seo优化外包顾问
  • 国内装饰行业网站制作销售方案