View Code? Open in Web Editor
NEW
基于SpringBoot的单体多层架构示例工程。《凤凰架构》的配套组件。
Home Page: http://icyfenix.cn
License: Apache License 2.0
Dockerfile 0.18%
Java 98.94%
HTML 0.70%
Shell 0.17%
monolithic_arch_springboot's Introduction
程序员
华为七级专家,兼职一些管理与研究工作的程序员。主要从事大型企业级软件的架构与研发工作,参与过 MetaERP、MetaCRM 等重要变革项目,分别担任首席技术规划与总架构师。业余里对计算机科学相关的多个领域都有持续跟进。
研究员
理学博士,华为企业应用教研室主任。曾任远光软件研究院院长,澳门科大-远光人工智能联合实验室主任,研究方向为机器学习自动化特征选择。
计算机技术作家 出版过八部计算机技术书籍,撰写过两部开源文档,口碑和销量均得到业内认可。其中五本书在豆瓣 上获得了 9.0 分或以上的评价,“深入理解 Java 虚拟机”系列重印超过 45 次,总销量逾 40 万册。
技术布道师
开源技术的积极倡导者和推动者,国内主流云计算厂商的最有价值技术专家,媒体撰稿人,会议讲师。
monolithic_arch_springboot's People
monolithic_arch_springboot's Issues
项目:bookstore-monolithic-springboot
类: AccountValidation
protected Predicate predicate = c -> true;
多个注解使用成员变量predicate会不会造成线程安全问题?
I can't log in with default password '123456'.I delete it from database and create an identical account, the password encoded is different from the password in the data.sql.
PaymentApplicationService中支付订单的逻辑如下,先把订单状态改为支付,再去扣减钱包的钱
这个接口是由"/restful/pay"触发,也就是第三方支付支付成功的前提下才会执行如下逻辑
那么有如下两个问题:
1、第三方支付成功了,为什么还要有这个钱包的概念。
2、如下代码的执行顺序是把订单改为支付成功,再去扣减钱包的余额,但是此时余额不足的情况下,订单状态依然是支付成功的。
public void accomplishPayment(Integer accountId, String payId) {
// 订单从冻结状态变为派送状态,扣减库存
double price = paymentService.accomplish(payId);
// 扣减货款
walletService.decrease(accountId, price);
// 支付成功的清除缓存
settlementCache.evict(payId);
}
timer.schedule(new TimerTask() { public void run() { synchronized (payment.getPayId().intern()) { // 使用2分钟之前的Payment到数据库中查出当前的Payment Payment currentPayment = paymentRepository.findById(payment.getId()).orElseThrow(() -> new EntityNotFoundException(payment.getId().toString())); if (currentPayment.getPayState() == Payment.State.WAITING) { log.info("支付单{}当前状态为:WAITING,转变为:TIMEOUT", payment.getId()); accomplishSettlement(Payment.State.TIMEOUT, payment.getPayId()); } } } }, payment.getExpires());
1.先findById,2.再判断状态,3,再执行accomplishSettlement
如果产生并发可能产生在accomplishSettlement之前payment已经被支付了,是否可能产生业务问题。
jdk 18情况下,下载此工程,然后执行mvnw.cmd package 发现测试失败报错。
报错:
Jacoco java.lang.instrument.IllegalClassFormatException: Error while instrumenting Class
我的解决方法是升级jacoco到0.8.8即可。
接下来另外一个错误是测试用例PaymentResourceTest.updatePaymentState 失败,我暂时标注掉它解决
然后,ProdcutResourceTest.updateAndQueryStockpile失败,我暂时标注掉它解决
在Eclipse内没有这些问题。
java.exe -version
openjdk version "18.0.1" 2022-04-19
OpenJDK Runtime Environment (build 18.0.1+10-24)
OpenJDK 64-Bit Server VM (build 18.0.1+10-24, mixed mode, sharing)
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'JWTAccessToken': Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2]
需要修改pom.xml的maven-compiler-plugin增加-parameters参数,否则登录时提示“Null key returned for cache operation (maybe you are using named params on classes without debug info?) caches=[value] | key='#xxx' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless='' | sync='false'”
代码中是否应该将repository.findById 改为 repository.findByProductId ?
/**
* 执行操作(带自定义的失败处理),并根据操作是否成功返回给客户端相应信息
* 封装了在服务端接口中很常见的执行操作,成功返回成功标志、失败返回失败标志的通用操作,用于简化编码
*/
public static Response op(Runnable executor, Consumer exceptionConsumer) {
try {
executor.run();
return CommonResponse.success();
} catch (Exception e) {
exceptionConsumer.accept(e);
return CommonResponse.failure(e.getMessage());
}
}
您这边使用线程执行service逻辑,
1、 首先方法会在try中执行,spring事务在执行回滚时,是捕捉运行时异常才会生效,您这样写,我不太理解
2、其次您这个方法类似于多线程执行,但是spring事务默认是在主线程中执行,没有实现跨线程,这样的代码不确定是否生效