JAVA代码优化:记录日志

登录中的一条日志记录代码:

//异步任务管理器(详见文章异步任务管理器)
//me()  初始化线程池
AsyncManager.me()
.execute(
//异步工厂记录登录信息
AsyncFactory.recordLogininfor
(
//使用者姓名
username,
//常量登录失败public static final String LOGIN_FAIL = "Error";
 Constants.LOGIN_FAIL,
//简单的静态方法,可以根据消息键和参数从国际化资源文件中获取对应的国际化翻译值。
 MessageUtils.message("user.jcaptcha.expire")
)
);

日志的数据库: 

 1.MessageUtil

这个工具类提供了一个简单的静态方法,可以根据消息键和参数从国际化资源文件中获取对应的国际化翻译值。

获取消息的静态方法:

  1. 该工具类包含一个静态方法message,用于根据消息键和参数获取国际化翻译值。
  2. 方法接收消息键(code)和可变数量的参数(args)作为输入。
  3. 内部通过SpringUtils.getBean(MessageSource.class)方式获取MessageSource对象,MessageSource是Spring框架用于支持国际化的接口。
  4. 调用messageSource.getMessage(code, args, LocaleContextHolder.getLocale())方法来获取具体的国际化消息值,其中code为消息键,args为参数,LocaleContextHolder.getLocale()用于获取当前的Locale信息。
package com.muyuan.common.utils;

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import com.muyuan.common.utils.spring.SpringUtils;

/**
 * 获取i18n资源文件
 * 
 * 
 */
public class MessageUtils {
    /**
     * 根据消息键和参数 获取消息 委托给spring messageSource
     *
     * @param code 消息键
     * @param args 参数
     * @return 获取国际化翻译值
     */
    public static String message(String code, Object... args) {
        //SpringUtils细节查看Spring工具类
        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
    }
}

2.异步工厂类(AsyncFactory)

AsyncFactory类提供了两个静态方法,用于生成记录登录信息和操作日志的任务。这些任务会在后台异步执行,并将相关信息插入到数据库中。

  1. 方法recordLogininfor用于记录登录信息。它接收用户名(username)、状态(status)、消息(message)和其他参数(args)作为输入,并返回一个TimerTask对象作为任务。

    首先,代码通过ServletRequestUtils.getRequest()方法获取HttpServletRequest对象,再通过HttpServletRequest对象的getHeader("User-Agent")方法获取User-Agent头部信息,然后使用UserAgent.parseUserAgentString()方法解析User-Agent字符串,得到UserAgent对象。

    接着,通过IpUtils.getIpAddr()方法获取客户端的IP地址,并使用AddressUtils.getRealAddressByIP()方法获取IP地址对应的物理地址。

    然后,使用StringBuilder拼接日志信息,包括IP地址、物理地址、用户名、状态和消息。

    最后,根据登录状态设置SysLogininfor对象的状态属性,并调用ISysLogininforService接口的insertLogininfor()方法插入数据。

  2. 方法recordOper用于记录操作日志。它接收SysOperLog对象作为输入,并返回一个TimerTask对象作为任务。

    该方法通过SysOperLog对象的getOperIp()方法获取操作IP地址,并使用AddressUtils.getRealAddressByIP()方法获取IP地址对应的物理地址。

    最后,调用ISysOperLogService接口的insertOperlog()方法插入操作日志数据。

    package com.muyuan.framework.manager.factory;
    
    import java.util.TimerTask;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import com.muyuan.common.constant.Constants;
    import com.muyuan.common.utils.LogUtils;
    import com.muyuan.common.utils.ServletUtils;
    import com.muyuan.common.utils.ip.AddressUtils;
    import com.muyuan.common.utils.ip.IpUtils;
    import com.muyuan.common.utils.spring.SpringUtils;
    import com.muyuan.clues.domain.SysLogininfor;
    import com.muyuan.clues.domain.SysOperLog;
    import com.muyuan.clues.service.ISysLogininforService;
    import com.muyuan.clues.service.ISysOperLogService;
    import eu.bitwalker.useragentutils.UserAgent;
    
    /**
     * 异步工厂(产生任务用)
     * 
     * 
     */
    public class AsyncFactory {
    	//Logger是用于在应用程序中记录和输出日志信息的类。
    	//sys-user是Logger的名称,用于标识该日志记录器的名称空间。
    	// 通过LoggerFactory.getLogger()方法,可以根据名称获取相应的Logger实例。
    	//用来记录与系统用户相关的日志信息。通过调用Logger的方法(如error、info、debug等)
    	// 可以将日志信息输出到不同的目标(如控制台、文件、数据库等)以便进行查看和分析。
    	private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user");
    
    	/**
    	 * 记录登录信息
    	 * 
    	 * @param username 用户名
    	 * @param status   状态
    	 * @param message  消息
    	 * @param args     列表
    	 * @return 任务task
    	 */
    	public static TimerTask recordLogininfor(final String username, final String status, final String message,
    			final Object... args) {
    		final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent"));
    		final String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
    		return new TimerTask() {
    			@Override
    			public void run() {
    				//根据IP地址获取真实的物理地址(详见文章地址工具类)
    				String address = AddressUtils.getRealAddressByIP(ip);
    				StringBuilder s = new StringBuilder();
    				//追加消息
    				//LogUtils处理并记录日志文件
    				//public class LogUtils
    				//{
    				//    public static String getBlock(Object msg)
    				//    {
    				//        if (msg == null)
    				//        {
    				//            msg = "";
    				//        }
    				//        return "[" + msg.toString() + "]";
    				//    }
    				//}
    				s.append(LogUtils.getBlock(ip));
    				s.append(address);
    				s.append(LogUtils.getBlock(username));
    				s.append(LogUtils.getBlock(status));
    				s.append(LogUtils.getBlock(message));
    				// 打印信息到日志
    				sys_user_logger.info(s.toString(), args);
    				// 获取客户端操作系统
    				String os = userAgent.getOperatingSystem().getName();
    				// 获取客户端浏览器
    				String browser = userAgent.getBrowser().getName();
    				// 封装对象(登录消息的一个参数)
    				SysLogininfor logininfor = new SysLogininfor();
    				logininfor.setUserName(username);
    				logininfor.setIpaddr(ip);
    				logininfor.setLoginLocation(address);
    				logininfor.setBrowser(browser);
    				logininfor.setOs(os);
    				logininfor.setMsg(message);
    				// 日志状态
    					//常量public static final String LOGIN_SUCCESS = "Success";
    					//常量public static final String LOGOUT = "Logout";
    				if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) {
    					//常量成功标识 public static final String SUCCESS = "0";
    					logininfor.setStatus(Constants.SUCCESS);
    				} else if (Constants.LOGIN_FAIL.equals(status)) {
    					//常量失败标识 public static final String FAIL = "1";
    					logininfor.setStatus(Constants.FAIL);
    				}
    				// 插入数据(SpringUtil详见)
                    //ISysLogininforService见下方
    				SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
    			}
    		};
    	}
    
    	/**
    	 * 操作日志记录
    	 * 
    	 * @param operLog 操作日志信息
    	 * @return 任务task
    	 */
    	public static TimerTask recordOper(final SysOperLog operLog) {
    		return new TimerTask() {
    			@Override
    			public void run() {
    				// 远程查询操作地点(详见通过ip获取地址)
    				operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
    				SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
    			}
    		};
    	}
    }

    日志记录服务层(ISysOperLogService)

package com.muyuan.clues.service;

import java.util.List;
import com.muyuan.clues.domain.SysOperLog;

/**
 * 操作日志 服务层
 * 
 * 
 */
public interface ISysOperLogService
{
    /**
     * 新增操作日志
     * 
     * @param operLog 操作日志对象
     */
    public void insertOperlog(SysOperLog operLog);

    /**
     * 查询系统操作日志集合
     * 
     * @param operLog 操作日志对象
     * @return 操作日志集合
     */
    public List<SysOperLog> selectOperLogList(SysOperLog operLog);

    /**
     * 批量删除系统操作日志
     * 
     * @param operIds 需要删除的操作日志ID
     * @return 结果
     */
    public int deleteOperLogByIds(Long[] operIds);

    /**
     * 查询操作日志详细
     * 
     * @param operId 操作ID
     * @return 操作日志对象
     */
    public SysOperLog selectOperLogById(Long operId);

    /**
     * 清空操作日志
     */
    public void cleanOperLog();
}

日志记录服务层处理(SysOperLogServiceImpl)

package com.muyuan.clues.service.impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.muyuan.clues.domain.SysOperLog;
import com.muyuan.clues.mapper.SysOperLogMapper;
import com.muyuan.clues.service.ISysOperLogService;

/**
 * 操作日志 服务层处理
 * 
 * 
 */
@Service
public class SysOperLogServiceImpl implements ISysOperLogService {
	
	@Autowired
	private SysOperLogMapper operLogMapper;

	/**
	 * 新增操作日志
	 * 
	 * @param operLog 操作日志对象
	 */
	@Override
	public void insertOperlog(SysOperLog operLog) {
		operLogMapper.insertOperlog(operLog);
	}

	/**
	 * 查询系统操作日志集合
	 * 
	 * @param operLog 操作日志对象
	 * @return 操作日志集合
	 */
	@Override
	public List<SysOperLog> selectOperLogList(SysOperLog operLog) {
		return operLogMapper.selectOperLogList(operLog);
	}

	/**
	 * 批量删除系统操作日志
	 * 
	 * @param operIds 需要删除的操作日志ID
	 * @return 结果
	 */
	@Override
	public int deleteOperLogByIds(Long[] operIds) {
		return operLogMapper.deleteOperLogByIds(operIds);
	}

	/**
	 * 查询操作日志详细
	 * 
	 * @param operId 操作ID
	 * @return 操作日志对象
	 */
	@Override
	public SysOperLog selectOperLogById(Long operId) {
		return operLogMapper.selectOperLogById(operId);
	}

	/**
	 * 清空操作日志
	 */
	@Override
	public void cleanOperLog() {
		operLogMapper.cleanOperLog();
	}
}

日志记录数据层(SysOperLogMapper)

package com.muyuan.clues.mapper;

import java.util.List;
import com.muyuan.clues.domain.SysOperLog;

/**
 * 操作日志 数据层
 * 
 * 
 */
public interface SysOperLogMapper
{
    /**
     * 新增操作日志
     * 
     * @param operLog 操作日志对象
     */
    public void insertOperlog(SysOperLog operLog);

    /**
     * 查询系统操作日志集合
     * 
     * @param operLog 操作日志对象
     * @return 操作日志集合
     */
    public List<SysOperLog> selectOperLogList(SysOperLog operLog);

    /**
     * 批量删除系统操作日志
     * 
     * @param operIds 需要删除的操作日志ID
     * @return 结果
     */
    public int deleteOperLogByIds(Long[] operIds);

    /**
     * 查询操作日志详细
     * 
     * @param operId 操作ID
     * @return 操作日志对象
     */
    public SysOperLog selectOperLogById(Long operId);

    /**
     * 清空操作日志
     */
    public void cleanOperLog();
}

日志记录SQL语句层

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.muyuan.clues.mapper.SysOperLogMapper">

	<resultMap type="SysOperLog" id="SysOperLogResult">
		<id     property="operId"         column="oper_id"        />
		<result property="title"          column="title"          />
		<result property="businessType"   column="business_type"  />
		<result property="method"         column="method"         />
		<result property="requestMethod"  column="request_method" />
		<result property="operatorType"   column="operator_type"  />
		<result property="operName"       column="oper_name"      />
		<result property="deptName"       column="dept_name"      />
		<result property="operUrl"        column="oper_url"       />
		<result property="operIp"         column="oper_ip"        />
		<result property="operLocation"   column="oper_location"  />
		<result property="operParam"      column="oper_param"     />
		<result property="jsonResult"     column="json_result"    />
		<result property="status"         column="status"         />
		<result property="errorMsg"       column="error_msg"      />
		<result property="operTime"       column="oper_time"      />
	</resultMap>

	<sql id="selectOperLogVo">
        select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
        from sys_oper_log
    </sql>
    
	<insert id="insertOperlog" parameterType="SysOperLog">
		insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
        values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate())
	</insert>
	
	<select id="selectOperLogList" parameterType="SysOperLog" resultMap="SysOperLogResult">
		<include refid="selectOperLogVo"/>
		<where>
			<if test="title != null and title != ''">
				AND title like concat('%', #{title}, '%')
			</if>
			<if test="businessType != null and businessType != ''">
				AND business_type = #{businessType}
			</if>
			<if test="businessTypes != null and businessTypes.length > 0">
			    AND business_type in
			    <foreach collection="businessTypes" item="businessType" open="(" separator="," close=")">
		 			#{businessType}
		        </foreach> 
			</if>
			<if test="status != null">
				AND status = #{status}
			</if>
			<if test="operName != null and operName != ''">
				AND oper_name like concat('%', #{operName}, '%')
			</if>
			<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
				and date_format(oper_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
			</if>
			<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
				and date_format(oper_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
			</if>
		</where>
		order by oper_id desc
	</select>
	
	<delete id="deleteOperLogByIds" parameterType="Long">
 		delete from sys_oper_log where oper_id in
 		<foreach collection="array" item="operId" open="(" separator="," close=")">
 			#{operId}
        </foreach> 
 	</delete>
 	
 	<select id="selectOperLogById" parameterType="Long" resultMap="SysOperLogResult">
		<include refid="selectOperLogVo"/>
		where oper_id = #{operId}
	</select>
	
	<update id="cleanOperLog">
        truncate table sys_oper_log
    </update>

</mapper> 

日志记录表

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.muyuan.clues.mapper.SysOperLogMapper">

	<resultMap type="SysOperLog" id="SysOperLogResult">
		<id     property="operId"         column="oper_id"        />
		<result property="title"          column="title"          />
		<result property="businessType"   column="business_type"  />
		<result property="method"         column="method"         />
		<result property="requestMethod"  column="request_method" />
		<result property="operatorType"   column="operator_type"  />
		<result property="operName"       column="oper_name"      />
		<result property="deptName"       column="dept_name"      />
		<result property="operUrl"        column="oper_url"       />
		<result property="operIp"         column="oper_ip"        />
		<result property="operLocation"   column="oper_location"  />
		<result property="operParam"      column="oper_param"     />
		<result property="jsonResult"     column="json_result"    />
		<result property="status"         column="status"         />
		<result property="errorMsg"       column="error_msg"      />
		<result property="operTime"       column="oper_time"      />
	</resultMap>

	<sql id="selectOperLogVo">
        select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time
        from sys_oper_log
    </sql>
    
	<insert id="insertOperlog" parameterType="SysOperLog">
		insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time)
        values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate())
	</insert>
	
	<select id="selectOperLogList" parameterType="SysOperLog" resultMap="SysOperLogResult">
		<include refid="selectOperLogVo"/>
		<where>
			<if test="title != null and title != ''">
				AND title like concat('%', #{title}, '%')
			</if>
			<if test="businessType != null and businessType != ''">
				AND business_type = #{businessType}
			</if>
			<if test="businessTypes != null and businessTypes.length > 0">
			    AND business_type in
			    <foreach collection="businessTypes" item="businessType" open="(" separator="," close=")">
		 			#{businessType}
		        </foreach> 
			</if>
			<if test="status != null">
				AND status = #{status}
			</if>
			<if test="operName != null and operName != ''">
				AND oper_name like concat('%', #{operName}, '%')
			</if>
			<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
				and date_format(oper_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
			</if>
			<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
				and date_format(oper_time,'%y%m%d') &lt;= date_format(#{params.endTime},'%y%m%d')
			</if>
		</where>
		order by oper_id desc
	</select>
	
	<delete id="deleteOperLogByIds" parameterType="Long">
 		delete from sys_oper_log where oper_id in
 		<foreach collection="array" item="operId" open="(" separator="," close=")">
 			#{operId}
        </foreach> 
 	</delete>
 	
 	<select id="selectOperLogById" parameterType="Long" resultMap="SysOperLogResult">
		<include refid="selectOperLogVo"/>
		where oper_id = #{operId}
	</select>
	
	<update id="cleanOperLog">
        truncate table sys_oper_log
    </update>

</mapper> 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212386.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vivado实现分析与收敛技巧8-布局规划技巧

布局规划技巧 对于从未满足时序的设计以及不适合更改网表或约束的设计 &#xff0c; 可考虑采用门级布局规划。 分层布局规划 分层布局规划支持您将一个或多个层级布局在片上某个区域内。此区域可向布局器提供全局层面的指导信息 &#xff0c; 并由布局器执行详细布局。分层…

BUUCTF 间谍启示录 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 在城际公路的小道上&#xff0c;罪犯G正在被警方追赶。警官X眼看他正要逃脱&#xff0c;于是不得已开枪击中了罪犯G。罪犯G情急之下将一个物体抛到了前方湍急的河流中&#xff0c;便头一歪突然倒地。警官X接近一看&…

6.6 Windows驱动开发:内核枚举Minifilter微过滤驱动

Minifilter 是一种文件过滤驱动&#xff0c;该驱动简称为微过滤驱动&#xff0c;相对于传统的sfilter文件过滤驱动来说&#xff0c;微过滤驱动编写时更简单&#xff0c;其不需要考虑底层RIP如何派发且无需要考虑兼容性问题&#xff0c;微过滤驱动使用过滤管理器FilterManager提…

人工智能 - 人脸识别:发展历史、技术全解与实战

目录 一、人脸识别技术的发展历程早期探索&#xff1a;20世纪60至80年代技术价值点&#xff1a; 自动化与算法化&#xff1a;20世纪90年代技术价值点&#xff1a; 深度学习的革命&#xff1a;21世纪初至今技术价值点&#xff1a; 二、几何特征方法详解与实战几何特征方法的原理…

20.Oracle11g中的触发器

oracle11g中的触发器 一、触发器的概述1、什么是触发器2、触发器的类型3、触发器的组成4、触发器的作用 二、触发器的创建语法1、创建语法2、数据库启动触发器3、 用户登录触发器&#xff1a; 三、对触发器的基本操作点击此处跳转下一节&#xff1a;21.Oracle的程序包(Package)…

Opencv框选黑色字体进行替换(涉及知识点:selectROI,在控制台输入字体大小,颜色,内容替换所选择的区域)

import cv2 from PIL import Image,ImageDraw,ImageFont import numpy as npimg_path ../img/ img_clean_path ../img_clean/ name xiao_ben suf .pngimg cv2.imread(img_pathnamesuf) cv2.imshow(original, img)# 选择ROI roi cv2.selectROI(windowName"original&q…

面试题:项目中如何解决跨域问题(HttpClient、注解、网关)

文章目录 为什么会有跨域问题常见的跨域解决方式网关整合项目中使用Httpclient 为什么会有跨域问题 因为浏览器的同源政策&#xff0c;就会产生跨域。比如说发送的异步请求是不同的两个源&#xff0c;就比如是不同的的两个端口或者不同的两个协议或者不同的域名。由于浏览器为…

Java毕业设计 SSM SpringBoot vue 夜市摊位管理系统

Java毕业设计 SSM SpringBoot vue 夜市摊位管理系统 SSM SpringBoot vue 夜市摊位管理系统 功能介绍 首页 图片轮播 通知公告 留言反馈 摊位信息 摊位详情 收藏 评论 赞 踩 登录注册 个人中心 更新信息 我的收藏 大数据夜市摊位统计 系统介绍 后台管理 登录 轮博图管理 通知…

【STM32】STM32学习笔记-课程简介(01)

00. 目录 文章目录 00. 目录01. 课程简介02. 硬件设备03. 软件工具04. 硬件套件4.1 面包板和跳线/飞线4.2 杜邦线和STM32最小系统板4.3 STLINK和OLED显示屏4.4 LED和按键4.5 电位器和蜂鸣器4.6 传感器和旋转编码器4.7 USB转串口和MPU60504.8 Flash闪存和电机模块4.9 SG90舵机 0…

geemap学习笔记015:下载哨兵2号(Sentinel-2)数据

前言 使用GEE下载数据应该是最常见的功能了&#xff0c;今天就介绍一下如何使用geemap下载哨兵2号(Sentinel-2)数据&#xff0c;分别包括自己画感兴趣&#xff0c;以及利用Assets中的shp文件进行下载。 1 自己画感兴趣下载哨兵2号影像 import geemap import eeMap geemap.M…

c++--类型行为控制

1.c的类 1.1.c的类关键点 c类型的关键点在于类存在继承。在此基础上&#xff0c;类存在构造&#xff0c;赋值&#xff0c;析构三类通用的关键行为。 类型提供了构造函数&#xff0c;赋值运算符&#xff0c;析构函数来让我们控制三类通用行为的具体表现。 为了清楚的说明类的构…

百度智能云推出“千帆AI原生应用开发工作台” 助力开发者创新

在这个智能互联的世界&#xff0c;每一次技术的飞跃都预示着无限可能。你是否曾梦想&#xff0c;一款产品能够打破创新的边界&#xff0c;让开发不再是高门槛的技术挑战&#xff1f;12月20日&#xff0c;百度云智大会智算大会将为你揭开这幕神秘面纱——“千帆AI原生应用开发工…

Python中的并发编程

目录 一、引言 二、Python中的线程 1、线程的概念 2、创建线程 3、线程同步和锁 4、线程池 三、Python中的进程 1、进程的概念 2、创建进程 四、Python中的异步IO 1、异步IO的概念 2、异步IO的实现 3、异步IO的并发执行 五、总结 一、引言 并发编程是一种计算机…

消息中间件——RabbitMQ(七)高级特性 2

前言 上一篇消息中间件——RabbitMQ&#xff08;七&#xff09;高级特性 1中我们介绍了消息如何保障100%的投递成功&#xff1f;,幂等性概念详解,在海量订单产生的业务高峰期&#xff0c;如何避免消息的重复消费的问题&#xff1f;,Confirm确认消息、Return返回消息。这篇我们…

LLM推理部署(四):一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台FastChat

FastChat是用于对话机器人模型训练、部署、评估的开放平台。体验地址为&#xff1a;https://chat.lmsys.org/&#xff0c;该体验平台主要是为了收集人类的真实反馈&#xff0c;目前已经支持30多种大模型&#xff0c;已经收到500万的请求&#xff0c;收集了10万调人类对比大模型…

6-69.鸭子也是鸟

按要求完成下面的程序&#xff1a; 1、定义一个Bird类&#xff0c;包含一个void类型的无参的speak方法&#xff0c;输出“Jiu-Jiu-Jiu”。 2、定义一个Duck类&#xff0c;公有继承自Bird类&#xff0c;其成员包括&#xff1a; &#xff08;1&#xff09;私有string类型的成员na…

4个解决特定的任务的Pandas高效代码

在本文中&#xff0c;我将分享4个在一行代码中完成的Pandas操作。这些操作可以有效地解决特定的任务&#xff0c;并以一种好的方式给出结果。 从列表中创建字典 我有一份商品清单&#xff0c;我想看看它们的分布情况。更具体地说&#xff1a;希望得到唯一值以及它们在列表中出…

【高效开发工具系列】jackson入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

指针的综合运用第二期

1.指针数组 char *arr[5];//字符指针数组 int *arr[5];//整型指针数组 int ADD(int x,int y) { return xy; } int LOSE(int a,int b) { return a-b; } int *pa(int,int)ADD; int *pb(int,int)LOSE;//函数指针 int (*pc[2])(int,int){ADD,LOSE};//函数指针数组 //调用直接按数组…

VisionPro---PatMaxTool工具使用

CogPMAlignTool PatMax是一种图案位置搜索技术&#xff08;识别定位&#xff09;&#xff0c;PatMax图案不依赖于像素格栅&#xff0c;是基于边缘特征的模板匹配而不是基于像素的模板匹配&#xff0c;支持图像中特征的旋转与缩放&#xff0c;边缘特征表示图像中不同区域间界限…