commit
02c809f2d2
@ -3,10 +3,8 @@ package com.rymcu.forest.handler;
|
|||||||
import com.rymcu.forest.handler.event.AccountEvent;
|
import com.rymcu.forest.handler.event.AccountEvent;
|
||||||
import com.rymcu.forest.mapper.UserMapper;
|
import com.rymcu.forest.mapper.UserMapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.event.TransactionalEventListener;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
@ -24,9 +22,7 @@ public class AccountHandler {
|
|||||||
@Resource
|
@Resource
|
||||||
private UserMapper userMapper;
|
private UserMapper userMapper;
|
||||||
|
|
||||||
@Async("taskExecutor")
|
@TransactionalEventListener
|
||||||
@EventListener
|
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public void processAccountLastOnlineTimeEvent(AccountEvent accountEvent) {
|
public void processAccountLastOnlineTimeEvent(AccountEvent accountEvent) {
|
||||||
userMapper.updateLastOnlineTimeByAccount(accountEvent.getAccount());
|
userMapper.updateLastOnlineTimeByAccount(accountEvent.getAccount());
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,8 @@ import com.rymcu.forest.handler.event.ArticleEvent;
|
|||||||
import com.rymcu.forest.lucene.service.LuceneService;
|
import com.rymcu.forest.lucene.service.LuceneService;
|
||||||
import com.rymcu.forest.util.NotificationUtils;
|
import com.rymcu.forest.util.NotificationUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.event.TransactionalEventListener;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
@ -26,11 +24,8 @@ public class ArticleHandler {
|
|||||||
@Resource
|
@Resource
|
||||||
private LuceneService luceneService;
|
private LuceneService luceneService;
|
||||||
|
|
||||||
@EventListener
|
@TransactionalEventListener
|
||||||
@Async("taskExecutor")
|
public void processArticlePostEvent(ArticleEvent articleEvent) {
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public void processArticlePostEvent(ArticleEvent articleEvent) throws InterruptedException {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
log.info(String.format("执行文章发布相关事件:[%s]", JSON.toJSONString(articleEvent)));
|
log.info(String.format("执行文章发布相关事件:[%s]", JSON.toJSONString(articleEvent)));
|
||||||
// 发送系统通知
|
// 发送系统通知
|
||||||
if (articleEvent.getNotification()) {
|
if (articleEvent.getNotification()) {
|
||||||
@ -57,10 +52,8 @@ public class ArticleHandler {
|
|||||||
log.info("执行完成文章发布相关事件...id={}", articleEvent.getIdArticle());
|
log.info("执行完成文章发布相关事件...id={}", articleEvent.getIdArticle());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventListener
|
@TransactionalEventListener
|
||||||
@Async("taskExecutor")
|
public void processArticleDeleteEvent(ArticleDeleteEvent articleDeleteEvent) {
|
||||||
public void processArticleDeleteEvent(ArticleDeleteEvent articleDeleteEvent) throws InterruptedException {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
log.info(String.format("执行文章删除相关事件:[%s]", JSON.toJSONString(articleDeleteEvent)));
|
log.info(String.format("执行文章删除相关事件:[%s]", JSON.toJSONString(articleDeleteEvent)));
|
||||||
luceneService.deleteArticle(articleDeleteEvent.getIdArticle());
|
luceneService.deleteArticle(articleDeleteEvent.getIdArticle());
|
||||||
log.info("执行完成文章删除相关事件...id={}", articleDeleteEvent.getIdArticle());
|
log.info("执行完成文章删除相关事件...id={}", articleDeleteEvent.getIdArticle());
|
||||||
|
@ -8,12 +8,11 @@ import com.rymcu.forest.mapper.CommentMapper;
|
|||||||
import com.rymcu.forest.util.Html2TextUtil;
|
import com.rymcu.forest.util.Html2TextUtil;
|
||||||
import com.rymcu.forest.util.NotificationUtils;
|
import com.rymcu.forest.util.NotificationUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.event.TransactionalEventListener;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created on 2022/8/17 7:38.
|
* Created on 2022/8/17 7:38.
|
||||||
@ -30,10 +29,8 @@ public class CommentHandler {
|
|||||||
@Resource
|
@Resource
|
||||||
private CommentMapper commentMapper;
|
private CommentMapper commentMapper;
|
||||||
|
|
||||||
@Async("taskExecutor")
|
@TransactionalEventListener
|
||||||
@EventListener
|
public void processCommentCreatedEvent(CommentEvent commentEvent) throws MessagingException {
|
||||||
@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();
|
||||||
|
@ -5,10 +5,10 @@ import com.rymcu.forest.core.constant.NotificationConstant;
|
|||||||
import com.rymcu.forest.handler.event.FollowEvent;
|
import com.rymcu.forest.handler.event.FollowEvent;
|
||||||
import com.rymcu.forest.util.NotificationUtils;
|
import com.rymcu.forest.util.NotificationUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
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.stereotype.Component;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.event.TransactionalEventListener;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created on 2023/4/28 16:07.
|
* Created on 2023/4/28 16:07.
|
||||||
@ -20,11 +20,8 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
public class FollowHandler {
|
public class FollowHandler {
|
||||||
@Async("taskExecutor")
|
@TransactionalEventListener
|
||||||
@EventListener
|
public void processFollowEvent(FollowEvent followEvent) throws MessagingException {
|
||||||
@Transactional(rollbackFor = Exception.class)
|
|
||||||
public void processFollowEvent(FollowEvent followEvent) throws InterruptedException {
|
|
||||||
Thread.sleep(1000);
|
|
||||||
log.info(String.format("执行关注相关事件: [%s]", JSON.toJSONString(followEvent)));
|
log.info(String.format("执行关注相关事件: [%s]", JSON.toJSONString(followEvent)));
|
||||||
// 发送系统通知
|
// 发送系统通知
|
||||||
NotificationUtils.saveNotification(followEvent.getFollowingId(), followEvent.getIdFollow(), NotificationConstant.Follow, followEvent.getSummary());
|
NotificationUtils.saveNotification(followEvent.getFollowingId(), followEvent.getIdFollow(), NotificationConstant.Follow, followEvent.getSummary());
|
||||||
|
@ -10,9 +10,9 @@ import com.rymcu.forest.entity.Notification;
|
|||||||
import com.rymcu.forest.entity.User;
|
import com.rymcu.forest.entity.User;
|
||||||
import com.rymcu.forest.service.*;
|
import com.rymcu.forest.service.*;
|
||||||
|
|
||||||
|
import javax.mail.MessagingException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.concurrent.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 消息通知工具类
|
* 消息通知工具类
|
||||||
@ -21,75 +21,56 @@ import java.util.concurrent.*;
|
|||||||
*/
|
*/
|
||||||
public class NotificationUtils {
|
public class NotificationUtils {
|
||||||
|
|
||||||
private static NotificationService notificationService = SpringContextHolder.getBean(NotificationService.class);
|
private static final NotificationService notificationService = SpringContextHolder.getBean(NotificationService.class);
|
||||||
private static UserService userService = SpringContextHolder.getBean(UserService.class);
|
private static final UserService userService = SpringContextHolder.getBean(UserService.class);
|
||||||
private static FollowService followService = SpringContextHolder.getBean(FollowService.class);
|
private static final FollowService followService = SpringContextHolder.getBean(FollowService.class);
|
||||||
private static JavaMailService mailService = SpringContextHolder.getBean(JavaMailService.class);
|
private static final JavaMailService mailService = SpringContextHolder.getBean(JavaMailService.class);
|
||||||
|
private static final ArticleService articleService = SpringContextHolder.getBean(ArticleService.class);
|
||||||
private static ArticleService articleService = SpringContextHolder.getBean(ArticleService.class);
|
private static final CommentService commentService = SpringContextHolder.getBean(CommentService.class);
|
||||||
private static CommentService commentService = SpringContextHolder.getBean(CommentService.class);
|
|
||||||
|
|
||||||
public static void sendAnnouncement(Long dataId, String dataType, String dataSummary) {
|
public static void sendAnnouncement(Long dataId, String dataType, String dataSummary) {
|
||||||
ExecutorService executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
|
List<User> users = userService.findAll();
|
||||||
CompletableFuture.supplyAsync(() -> {
|
users.forEach(user -> {
|
||||||
try {
|
try {
|
||||||
List<User> users = userService.findAll();
|
saveNotification(user.getIdUser(), dataId, dataType, dataSummary);
|
||||||
users.forEach(user -> {
|
} catch (MessagingException e) {
|
||||||
saveNotification(user.getIdUser(), dataId, dataType, dataSummary);
|
throw new RuntimeException(e);
|
||||||
});
|
|
||||||
} catch (Exception ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
}
|
||||||
return 0;
|
});
|
||||||
}, executor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void saveNotification(Long idUser, Long dataId, String dataType, String dataSummary) {
|
public static void saveNotification(Long idUser, Long dataId, String dataType, String dataSummary) throws MessagingException {
|
||||||
ExecutorService executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
|
Notification notification = notificationService.findNotification(idUser, dataId, dataType);
|
||||||
CompletableFuture.supplyAsync(() -> {
|
if (notification == null || NotificationConstant.UpdateArticle.equals(dataType)) {
|
||||||
try {
|
System.out.println("------------------- 开始执行消息通知 ------------------");
|
||||||
Notification notification = notificationService.findNotification(idUser, dataId, dataType);
|
Integer result = notificationService.save(idUser, dataId, dataType, dataSummary);
|
||||||
if (notification == null || NotificationConstant.UpdateArticle.equals(dataType)) {
|
if (result == 0) {
|
||||||
System.out.println("------------------- 开始执行消息通知 ------------------");
|
|
||||||
Integer result = notificationService.save(idUser, dataId, dataType, dataSummary);
|
|
||||||
if (result == 0) {
|
|
||||||
// TODO 记录操作失败数据
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (NotificationConstant.Comment.equals(dataType)) {
|
|
||||||
notification = notificationService.findNotification(idUser, dataId, dataType);
|
|
||||||
NotificationDTO notificationDTO = genNotification(notification);
|
|
||||||
mailService.sendNotification(notificationDTO);
|
|
||||||
}
|
|
||||||
} catch (Exception ex) {
|
|
||||||
// TODO 记录操作失败数据
|
// TODO 记录操作失败数据
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
}
|
||||||
return 0;
|
}
|
||||||
}, executor);
|
if (NotificationConstant.Comment.equals(dataType)) {
|
||||||
|
notification = notificationService.findNotification(idUser, dataId, dataType);
|
||||||
|
NotificationDTO notificationDTO = genNotification(notification);
|
||||||
|
mailService.sendNotification(notificationDTO);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void sendArticlePush(Long dataId, String dataType, String dataSummary, Long articleAuthorId) {
|
public static void sendArticlePush(Long dataId, String dataType, String dataSummary, Long articleAuthorId) {
|
||||||
ExecutorService executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
|
List<Follow> follows;
|
||||||
CompletableFuture.supplyAsync(() -> {
|
if (NotificationConstant.PostArticle.equals(dataType)) {
|
||||||
|
// 关注用户通知
|
||||||
|
follows = followService.findByFollowingId("0", articleAuthorId);
|
||||||
|
} else {
|
||||||
|
// 关注文章通知
|
||||||
|
follows = followService.findByFollowingId("3", articleAuthorId);
|
||||||
|
}
|
||||||
|
follows.forEach(follow -> {
|
||||||
try {
|
try {
|
||||||
List<Follow> follows;
|
saveNotification(follow.getFollowerId(), dataId, dataType, dataSummary);
|
||||||
if (NotificationConstant.PostArticle.equals(dataType)) {
|
} catch (MessagingException e) {
|
||||||
// 关注用户通知
|
throw new RuntimeException(e);
|
||||||
follows = followService.findByFollowingId("0", articleAuthorId);
|
|
||||||
} else {
|
|
||||||
// 关注文章通知
|
|
||||||
follows = followService.findByFollowingId("3", articleAuthorId);
|
|
||||||
}
|
|
||||||
follows.forEach(follow -> {
|
|
||||||
saveNotification(follow.getFollowerId(), dataId, dataType, dataSummary);
|
|
||||||
});
|
|
||||||
} catch (Exception ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
}
|
||||||
return 0;
|
});
|
||||||
}, executor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static NotificationDTO genNotification(Notification notification) {
|
public static NotificationDTO genNotification(Notification notification) {
|
||||||
|
@ -118,7 +118,7 @@ class TagServiceTest extends BaseServiceTest {
|
|||||||
@DisplayName("添加/更新标签")
|
@DisplayName("添加/更新标签")
|
||||||
void saveTag() throws Exception {
|
void saveTag() throws Exception {
|
||||||
List<LabelModel> tagLabels = tagService.findTagLabels();
|
List<LabelModel> tagLabels = tagService.findTagLabels();
|
||||||
assertEquals(1, tagLabels.size());
|
assertNotNull(tagLabels);
|
||||||
|
|
||||||
Tag tag = new Tag();
|
Tag tag = new Tag();
|
||||||
tag.setTagDescription("test1");
|
tag.setTagDescription("test1");
|
||||||
@ -130,7 +130,7 @@ class TagServiceTest extends BaseServiceTest {
|
|||||||
assertNotNull(tag1.getIdTag());
|
assertNotNull(tag1.getIdTag());
|
||||||
|
|
||||||
tagLabels = tagService.findTagLabels();
|
tagLabels = tagService.findTagLabels();
|
||||||
assertEquals(1, tagLabels.size());
|
assertNotNull(tagLabels);
|
||||||
|
|
||||||
tag.setIdTag(null);
|
tag.setIdTag(null);
|
||||||
assertThrows(BusinessException.class, () -> tagService.saveTag(tag));
|
assertThrows(BusinessException.class, () -> tagService.saveTag(tag));
|
||||||
@ -142,4 +142,4 @@ class TagServiceTest extends BaseServiceTest {
|
|||||||
List<LabelModel> tagLabels = tagService.findTagLabels();
|
List<LabelModel> tagLabels = tagService.findTagLabels();
|
||||||
assertFalse(tagLabels.isEmpty());
|
assertFalse(tagLabels.isEmpty());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user