Spring boot 项目 Spring 注入 代理 并支持 代理对象使用 @Autowired 去调用其他服务
类定义与依赖注入
@Service: 标识这是一个 Spring 管理的服务类。
ApplicationContextAware: 实现该接口允许你在类中获取 ApplicationContext 对象,从而可以访问 Spring 容器中的所有 Bean。
@Autowired: 注入了 AutowireCapableBeanFactory,用于自动装配新创建的代理对象。
方法解析
invokeSendMessage
此方法接收一个类名(对应于某个实现了 DeviceMessageInterface 的 Bean)和一个 SendMessage 对象作为参数。它首先通过 applicationContext.getBean() 获取目标 Bean 的实例,然后创建该实例的 CGLIB 代理,并调用代理的 sendMessage 方法。
invokeAllSendMessages
遍历所有实现了 DeviceMessageInterface 接口的 Bean,并对每个 Bean 创建其 CGLIB 代理对象,随后调用代理的 sendMessage 方法。这使得你可以一次性对所有相关处理 ...
CyclicBarrier线程辅助类的简单使用
简述CyclicBarrier 是另一个用于协调多个线程之间操作的同步辅助类,它允许一组线程互相等待彼此到达一个共同的屏障点(barrier)。与 CountDownLatch 不同的是,CyclicBarrier 可以被重置并且可以重复使用13。这意味着一旦所有参与的线程都到达了屏障点并继续执行后,CyclicBarrier 可以再次用于下一轮的同步操作。这使得 CyclicBarrier 在循环任务或需要多次同步的情况下非常有用。
CyclicBarrier 提供了一个构造函数来指定参与的线程数量,并且可以选择性地提供一个当最后一个线程到达屏障时要执行的动作。这个动作将在所有线程到达之前但在任何线程继续前进之后被执行。如果任意一个线程在等待过程中被打断或失败,那么所有的线程都会收到一个 BrokenBarrierException 异常。
内部机制CyclicBarrier 的内部实现依赖于计数器和条件变量(通常是锁和相关的等待/通知机制)。每当一个线程调用了 await() 方法时,它会首先检查计数器是否达到了创建 CyclicBarrier 时指定的“阈值”(即需要等 ...
Semaphore线程管理同步机制
概述Semaphore(信号量)是另一种同步机制,它管理一组许可证。每个 acquire() 调用会获取一个许可证,如果没有可用的许可证,则阻塞直到有许可证可用;而每次调用 release() 会释放一个许可证,增加可用的许可证数量。因此,Semaphore 可以用来限制同时访问某些资源的线程数目,确保不会超过设定的最大并发数10。
信号量分为公平性和非公平性两种模式。在公平模式下,信号量会按照请求的顺序分配许可证给等待的线程;而非公平模式则可能跳过前面等待的线程,优先响应新的请求。Semaphore 的典型应用场景包括但不限于控制对有限资源池(如数据库连接)的访问、实现生产者-消费者问题等。
信号量的工作原理信号量通过维护一个内部的许可集合来工作。当创建 Semaphore 对象时,需要指定初始的许可数量。每个线程在访问受保护的资源之前必须先从信号量中获取一个或多个许可(通过调用 acquire() 方法)。如果此时还有足够的许可可用,则该线程可以获得这些许可并继续执行;否则,线程将被阻塞直到有其他线程释放了相应的许可(通过调用 release() 方法)。一旦线程完成了对资源的操作 ...
Seata 分布式事务使用
分布式事务在分布式系统中,如果一个业务需要多个服务合作完成,而且每一个服务都有事务,多个事务必须同时成功或失败,这样的事务就是分布式事务。其中的每个服务的事务就是一个分支事务。整个业务称为全局事务。
安装 seatadocker 安装 seata配置参考 https://blog.csdn.net/weixin_42633509/article/details/145204282添加数据库
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980-- 1. 执行语句创建名为 seata 的数据库CREATE DATABASE seata DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;-- 2.执行脚本完成 Seata 表结构的创建use seata;-- htt ...
Spring cloud 用户登录以及用户信息流转大致流程
gateway配置yml文件yaml配置信息通过 jks 密钥文件获取用户信息, 对应账号密码,以及排除的url
123456789101112hm: jwt: location: classpath:hmall.jks alias: hmall password: hmall123 tokenTTL: 30m auth: excludePaths: - /search/** - /users/login - /items/** - /hi
实体类获取 对应 yaml 中解析过来的信息所有以 hm.jwt. 开头的配置属性映射到该类的字段中。
123456789@Data@ConfigurationProperties(prefix = "hm.jwt")public class JwtProperties { private Resource location; private String password; private String alias; ...
通过 winsw 把相关服务配置windows自启动
描述WinSW(Windows Service Wrapper)是一个开源工具,旨在帮助在Windows操作系统上将任意可执行文件作为Windows服务运行。它特别适用于那些本身不支持直接安装为Windows服务的应用程序。通过使用WinSW,用户可以更容易地管理这些应用程序的生命周期,包括启动、停止和监控等操作。
以下是WinSW的一些主要特点和功能:
简化服务安装与卸载:通过简单的配置文件设置,即可轻松地将程序安装为Windows服务。
灵活的日志选项:允许用户自定义日志记录方式,如将输出重定向到文件或标准输出/错误流。
多种服务行为控制:提供了对服务失败后的重启策略、依赖项和服务状态检查等高级功能的支持。
跨平台兼容性:虽然名为WinSW,但其.NET版本也支持在Linux和macOS上运行(需要Mono框架支持),不过主要用途还是在Windows平台上。
与Java服务的集成:对于基于Java的应用程序,WinSW提供了一个专门的分支(winsw/java),以更好地支持这类应用的部署。
要使用WinSW,你需要准备一个可执行文件以及一个XML格式的配置文 ...
创建简单的 PL/pgSQL 存储过程
在 PostgreSQL 中,创建存储过程可以通过使用 CREATE FUNCTION 语句来实现。PostgreSQL 支持多种语言编写存储过程,包括 SQL、PL/pgSQL(Procedural Language/PostgreSQL)、PL/Python、PL/Perl 等。其中,PL/pgSQL 是最常用的内置过程语言。
创建简单的 PL/pgSQL 存储过程假设我们想要创建一个存储过程,它接受两个整数作为输入参数,并返回它们的和。
12345678910-- 创建存储过程CREATE OR REPLACE FUNCTION add_two_numbers(a integer, b integer)RETURNS integer AS $$BEGIN RETURN a + b;END;$$ LANGUAGE plpgsql;-- 调用存储过程SELECT add_two_numbers(3, 5);
CREATE OR REPLACE FUNCTION
CREATE:这是用来创建新对象的关键字。
OR REP ...
CountDownLatch 线程计数器使用总结
概述CountDownLatch 是 Java 并发包 java.util.concurrent 中的一个同步辅助类。它允许一个或多个线程一直等待,直到其他线程完成一系列的操作。
用处说明CountDownLatch 是 Java 并发包 (java.util.concurrent) 中的一个同步辅助类,它允许一个或多个线程等待其他线程完成一系列操作后再继续执行。CountDownLatch 通过内部计数器来实现这一点,计数器的值可以通过构造函数初始化,并且只能递减。当计数器达到零时,所有等待的线程将被释放并继续执行。
用处协调多个线程的启动:确保某些线程在所有准备工作完成之前不会开始工作。分阶段执行任务:例如,在多阶段处理过程中,可以使用 CountDownLatch 来确保前一阶段的所有任务都完成后才进入下一阶段。等待一组线程完成:主调用者可以等待一批工作者线程完成它们的工作后继续进行。测试和调试:在并发编程测试中,CountDownLatch 可以用来同步线程的行为,以确保按照预期顺序执行。
优缺点优点
简单易用:API 设计直观,容易理解和使用。 非阻塞等待:与传统的 wait ...
Postgresql 配置数据库表添加主键自增id
在 PostgreSQL 数据库中,如果你想创建一个自增的 ID 字段,通常会使用序列(sequence)配合默认值或者使用带有自动递增特性的 SERIAL 类型。以下是两种常见的方法来实现自增 ID:使用 SERIAL 类型SERIAL 是一个特殊的类型,实际上是 integer 类型的一个别名,并且在创建表的时候会自动添加一个序列和默认值。这个序列会在每次插入新行并且没有明确指定该列值的时候自动递增。
12345CREATE TABLE my_table ( id SERIAL PRIMARY KEY, name VARCHAR(100), data TEXT);
显式地使用序列如果你不想使用 SERIAL 类型,也可以显式地创建一个序列,并将其与表中的某列关联起来。首先,创建一个序列:
1CREATE SEQUENCE my_table_id_seq;
接着,创建一个包含 id 列的表,并将序列与该列关联起来:
12345CREATE TABLE my_table ( id INTEGER PRIMARY KEY DEFAULT NEXTVAL( ...
pg数据库 原序列对不上数据库主键id 更新序列信息
当 PostgreSQL 数据库中的序列(sequence)与表的主键 ID 不再同步时,这通常意味着序列已经落后于实际的最大 ID 值,或者在某些情况下超前。要解决这个问题,你需要更新序列以匹配当前表中最大 ID 的值。以下是解决此问题的步骤和 SQL 语句示例。
确定表和序列首先,确认你要更新的表名以及对应的序列名。通常,如果你使用的是 SERIAL 或 BIGSERIAL 类型作为主键,PostgreSQL 会自动创建一个序列,并将其关联到该字段。你可以通过查询 pg_class 和 pg_depend 等系统表来找到序列名称。
1SELECT pg_get_serial_sequence('your_table_name', 'id');
这将返回类似 public.your_table_name_id_seq 的序列名称。
获取当前最大 ID 值接下来,找出表中当前的最大 ID 值。你可以直接从表中查询:
1SELECT MAX(id) FROM your_table_name;
设置序列的下一个值最后,使用 SETVAL 函数设置序列 ...
