🧑‍💻 增加异步事件回滚事务

🧑‍💻 增加异步事件回滚事务
This commit is contained in:
ronger 2023-04-28 16:19:32 +08:00 committed by GitHub
commit 6c9efc931e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 72 additions and 5 deletions

View File

@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -25,6 +26,7 @@ public class AccountHandler {
@Async("taskExecutor") @Async("taskExecutor")
@EventListener @EventListener
@Transactional(rollbackFor = Exception.class)
public void processAccountLastOnlineTimeEvent(AccountEvent accountEvent) { public void processAccountLastOnlineTimeEvent(AccountEvent accountEvent) {
userMapper.updateLastOnlineTimeByAccount(accountEvent.getAccount()); userMapper.updateLastOnlineTimeByAccount(accountEvent.getAccount());
} }

View File

@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -27,6 +28,7 @@ public class ArticleHandler {
@EventListener @EventListener
@Async("taskExecutor") @Async("taskExecutor")
@Transactional(rollbackFor = Exception.class)
public void processArticlePostEvent(ArticleEvent articleEvent) throws InterruptedException { public void processArticlePostEvent(ArticleEvent articleEvent) throws InterruptedException {
Thread.sleep(1000); Thread.sleep(1000);
log.info(String.format("执行文章发布相关事件:[%s]", JSON.toJSONString(articleEvent))); log.info(String.format("执行文章发布相关事件:[%s]", JSON.toJSONString(articleEvent)));

View File

@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -31,7 +32,8 @@ public class CommentHandler {
@Async("taskExecutor") @Async("taskExecutor")
@EventListener @EventListener
public void processCommentCreatedEvent(CommentEvent commentEvent) throws InterruptedException { @Transactional(rollbackFor = Exception.class)
public void processCommentCreatedEvent(CommentEvent commentEvent) {
log.info(String.format("开始执行评论发布事件:[%s]", JSON.toJSONString(commentEvent))); log.info(String.format("开始执行评论发布事件:[%s]", JSON.toJSONString(commentEvent)));
String commentContent = commentEvent.getContent(); String commentContent = commentEvent.getContent();
int length = commentContent.length(); int length = commentContent.length();

View File

@ -0,0 +1,33 @@
package com.rymcu.forest.handler;
import com.alibaba.fastjson.JSON;
import com.rymcu.forest.core.constant.NotificationConstant;
import com.rymcu.forest.handler.event.FollowEvent;
import com.rymcu.forest.util.NotificationUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
/**
* Created on 2023/4/28 16:07.
*
* @author ronger
* @email ronger-x@outlook.com
* @desc : com.rymcu.forest.handler
*/
@Slf4j
@Component
public class FollowHandler {
@Async("taskExecutor")
@EventListener
@Transactional(rollbackFor = Exception.class)
public void processFollowEvent(FollowEvent followEvent) throws InterruptedException {
Thread.sleep(1000);
log.info(String.format("执行关注相关事件: [%s]", JSON.toJSONString(followEvent)));
// 发送系统通知
NotificationUtils.saveNotification(followEvent.getFollowingId(), followEvent.getIdFollow(), NotificationConstant.Follow, followEvent.getSummary());
log.info("执行完成关注相关事件...");
}
}

View File

@ -0,0 +1,22 @@
package com.rymcu.forest.handler.event;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* Created on 2023/4/28 16:04.
*
* @author ronger
* @email ronger-x@outlook.com
* @desc : com.rymcu.forest.handler.event
*/
@Data
@AllArgsConstructor
public class FollowEvent {
private Long followingId;
private Long idFollow;
private String summary;
}

View File

@ -18,6 +18,7 @@ public interface TagService extends Service<Tag> {
* *
* @param article * @param article
* @param articleContentHtml * @param articleContentHtml
* @param userId
* @return * @return
* @throws UnsupportedEncodingException * @throws UnsupportedEncodingException
*/ */

View File

@ -1,13 +1,14 @@
package com.rymcu.forest.service.impl; package com.rymcu.forest.service.impl;
import com.rymcu.forest.core.constant.NotificationConstant;
import com.rymcu.forest.core.service.AbstractService; import com.rymcu.forest.core.service.AbstractService;
import com.rymcu.forest.dto.UserDTO; import com.rymcu.forest.dto.UserDTO;
import com.rymcu.forest.entity.Follow; import com.rymcu.forest.entity.Follow;
import com.rymcu.forest.handler.event.FollowEvent;
import com.rymcu.forest.mapper.FollowMapper; import com.rymcu.forest.mapper.FollowMapper;
import com.rymcu.forest.service.FollowService; import com.rymcu.forest.service.FollowService;
import com.rymcu.forest.util.NotificationUtils; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List; import java.util.List;
@ -20,6 +21,8 @@ public class FollowServiceImpl extends AbstractService<Follow> implements Follow
@Resource @Resource
private FollowMapper followMapper; private FollowMapper followMapper;
@Resource
private ApplicationEventPublisher applicationEventPublisher;
@Override @Override
public Boolean isFollow(Integer followingId, String followingType, Long idUser) { public Boolean isFollow(Integer followingId, String followingType, Long idUser) {
@ -27,15 +30,17 @@ public class FollowServiceImpl extends AbstractService<Follow> implements Follow
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Boolean follow(Follow follow, String nickname) { public Boolean follow(Follow follow, String nickname) {
int result = followMapper.insertSelective(follow); int result = followMapper.insertSelective(follow);
if (result > 0) { if (result > 0) {
NotificationUtils.saveNotification(follow.getFollowingId(), follow.getIdFollow(), NotificationConstant.Follow, nickname + " 关注了你!"); applicationEventPublisher.publishEvent(new FollowEvent(follow.getFollowingId(), follow.getFollowerId(), nickname + " 关注了你!"));
} }
return result > 0; return result > 0;
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Boolean cancelFollow(Follow follow) { public Boolean cancelFollow(Follow follow) {
int result = followMapper.delete(follow); int result = followMapper.delete(follow);
return result == 0; return result == 0;

View File

@ -111,7 +111,7 @@ public class TagServiceImpl extends AbstractService<Tag> implements TagService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Tag saveTag(Tag tag) throws Exception { public Tag saveTag(Tag tag) {
Integer result; Integer result;
tag.setTagDescription(XssUtils.filterHtmlCode(tag.getTagDescription())); tag.setTagDescription(XssUtils.filterHtmlCode(tag.getTagDescription()));
if (tag.getIdTag() == null) { if (tag.getIdTag() == null) {