[AB-203] using task executors for the async listeners

fixing starboard post listener and service method
This commit is contained in:
Sheldan
2021-03-21 21:00:21 +01:00
parent ebed1daadc
commit 5eefc3909e
28 changed files with 305 additions and 58 deletions

View File

@@ -11,8 +11,13 @@ public class StarboardListenerConfig {
@Autowired
private ExecutorService executorService;
@Bean(name = "starboardStatusListenerExecutor")
public TaskExecutor joinListenerExecutor() {
return executorService.setupExecutorFor("starboardStatusListener");
@Bean(name = "starboardCreatedListenerExecutor")
public TaskExecutor starboardPostCreatedExecutor() {
return executorService.setupExecutorFor("starboardCreatedListener");
}
@Bean(name = "starboardDeletedListenerExecutor")
public TaskExecutor starboardPostDeletedExecutor() {
return executorService.setupExecutorFor("starboardDeletedListener");
}
}

View File

@@ -16,7 +16,7 @@ import java.util.Optional;
@Component
@Slf4j
public class StarboardPostDeletedListener implements AsyncMessageDeletedListener {
public class StarboardMessagePostDeletedListener implements AsyncMessageDeletedListener {
@Autowired
private StarboardPostManagementService starboardPostManagementService;
@@ -24,7 +24,7 @@ public class StarboardPostDeletedListener implements AsyncMessageDeletedListener
@Override
public DefaultListenerResult execute(MessageDeletedModel model) {
CachedMessage message = model.getCachedMessage();
Optional<StarboardPost> byStarboardPostId = starboardPostManagementService.findByStarboardPostId(message.getMessageId());
Optional<StarboardPost> byStarboardPostId = starboardPostManagementService.findByStarboardPostMessageId(message.getMessageId());
if(byStarboardPostId.isPresent()) {
StarboardPost post = byStarboardPostId.get();
log.info("Removing starboard post: message {}, channel {}, server {}, because the message was deleted",

View File

@@ -5,9 +5,8 @@ import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.service.FeatureConfigService;
import dev.sheldan.abstracto.core.service.FeatureFlagService;
import dev.sheldan.abstracto.starboard.listener.StarboardPostState;
import dev.sheldan.abstracto.starboard.listener.StarboardPostUpdatedListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostUpdatedModel;
import dev.sheldan.abstracto.starboard.listener.StarboardPostCreatedListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostCreatedModel;
import dev.sheldan.abstracto.starboard.model.database.StarboardPost;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,17 +19,17 @@ import java.util.stream.Collectors;
@Component
@Slf4j
public class StarboardPostListenerManager {
public class StarboardPostCreatedListenerManager {
@Autowired(required = false)
private List<StarboardPostUpdatedListener> listeners;
private List<StarboardPostCreatedListener> listeners;
@Autowired
@Qualifier("starboardStatusListenerExecutor")
private TaskExecutor starboardStatusExecutor;
@Qualifier("starboardCreatedListenerExecutor")
private TaskExecutor starboardCreatedExecutor;
@Autowired
private StarboardPostListenerManager self;
private StarboardPostCreatedListenerManager self;
@Autowired
private FeatureConfigService featureConfigService;
@@ -46,20 +45,11 @@ public class StarboardPostListenerManager {
return;
}
ServerUser userReactingServerUser = ServerUser.builder().serverId(post.getServer().getId()).userId(userReactingId).build();
StarboardPostUpdatedModel model = createStarboardStatusModel(post, userReactingServerUser);
model.setNewState(StarboardPostState.CREATED);
listeners.forEach(listener -> listenerService.executeFeatureAwareListener(listener, model));
StarboardPostCreatedModel model = createStarboardStatusModel(post, userReactingServerUser);
listeners.forEach(listener -> listenerService.executeFeatureAwareListener(listener, model, starboardCreatedExecutor));
}
public void sendStarboardPostDeletedEvent(StarboardPost post, ServerUser userReacting) {
if(listeners == null || listeners.isEmpty()) {
return;
}
StarboardPostUpdatedModel model = createStarboardStatusModel(post, userReacting);
model.setNewState(StarboardPostState.DELETED);
}
private StarboardPostUpdatedModel createStarboardStatusModel(StarboardPost post, ServerUser userReacting) {
private StarboardPostCreatedModel createStarboardStatusModel(StarboardPost post, ServerUser userReacting) {
Long serverId = post.getServer().getId();
ServerUser starredUser = ServerUser
.builder()
@@ -85,9 +75,10 @@ public class StarboardPostListenerManager {
.stream()
.map(starboardPostReaction -> starboardPostReaction.getReactor().getUserReference().getId())
.collect(Collectors.toList());
return StarboardPostUpdatedModel
return StarboardPostCreatedModel
.builder()
.lastStarrer(userReacting)
.starboardPostId(post.getId())
.starredUser(starredUser)
.starboardMessage(starboardMessagePayLoad)
.starredMessage(starredMessage)

View File

@@ -0,0 +1,88 @@
package dev.sheldan.abstracto.starboard.service;
import dev.sheldan.abstracto.core.listener.ListenerService;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.core.service.FeatureConfigService;
import dev.sheldan.abstracto.core.service.FeatureFlagService;
import dev.sheldan.abstracto.starboard.listener.StarboardPostDeletedListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostDeletedModel;
import dev.sheldan.abstracto.starboard.model.database.StarboardPost;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.task.TaskExecutor;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
public class StarboardPostDeletedListenerManager {
@Autowired(required = false)
private List<StarboardPostDeletedListener> listeners;
@Autowired
@Qualifier("starboardDeletedListenerExecutor")
private TaskExecutor starboardDeletedExecutor;
@Autowired
private StarboardPostDeletedListenerManager self;
@Autowired
private FeatureConfigService featureConfigService;
@Autowired
private FeatureFlagService featureFlagService;
@Autowired
private ListenerService listenerService;
public void sendStarboardPostDeletedEvent(StarboardPost post, ServerUser userReacting) {
if(listeners == null || listeners.isEmpty()) {
return;
}
StarboardPostDeletedModel model = createStarboardStatusModel(post, userReacting);
listeners.forEach(listener -> listenerService.executeFeatureAwareListener(listener, model, starboardDeletedExecutor));
}
private StarboardPostDeletedModel createStarboardStatusModel(StarboardPost post, ServerUser userReacting) {
Long serverId = post.getServer().getId();
ServerUser starredUser = ServerUser
.builder()
.serverId(serverId)
.userId(post.getAuthor().getUserReference().getId())
.build();
ServerChannelMessage starboardMessagePayLoad = ServerChannelMessage
.builder()
.serverId(serverId)
.channelId(post.getStarboardChannel().getId())
.messageId(post.getStarboardMessageId())
.build();
ServerChannelMessage starredMessage = ServerChannelMessage
.builder()
.serverId(serverId)
.channelId(post.getSourceChannel().getId())
.messageId(post.getPostMessageId())
.build();
List<Long> starrerIds = post.
getReactions()
.stream()
.map(starboardPostReaction -> starboardPostReaction.getReactor().getUserReference().getId())
.collect(Collectors.toList());
return StarboardPostDeletedModel
.builder()
.lastStarrer(userReacting)
.starboardPostId(post.getId())
.starredUser(starredUser)
.starboardMessage(starboardMessagePayLoad)
.starredMessage(starredMessage)
.allStarrer(starrerIds)
.build();
}
}

View File

@@ -91,7 +91,10 @@ public class StarboardServiceBean implements StarboardService {
private StarboardServiceBean self;
@Autowired
private StarboardPostListenerManager starboardPostListenerManager;
private StarboardPostDeletedListenerManager starboardPostDeletedListenerManager;
@Autowired
private StarboardPostCreatedListenerManager starboardPostCreatedListenerManager;
@Autowired
private UserService userService;
@@ -138,7 +141,7 @@ public class StarboardServiceBean implements StarboardService {
AUserInAServer user = userInServerManagementService.loadUserOptional(aLong).orElseThrow(() -> new UserInServerNotFoundException(aLong));
starboardPostReactorManagementService.addReactor(starboardPost, user);
});
starboardPostListenerManager.sendStarboardPostCreatedEvent(userReactingId, starboardPost);
starboardPostCreatedListenerManager.sendStarboardPostCreatedEvent(userReactingId, starboardPost);
}
@@ -250,7 +253,7 @@ public class StarboardServiceBean implements StarboardService {
public void deleteStarboardPost(StarboardPost starboardPost, ServerUser userReacting) {
deleteStarboardMessagePost(starboardPost);
starboardPostManagementService.removePost(starboardPost);
starboardPostListenerManager.sendStarboardPostDeletedEvent(starboardPost, userReacting);
starboardPostDeletedListenerManager.sendStarboardPostDeletedEvent(starboardPost, userReacting);
}
private String getStarboardRankingEmote(Long serverId, Integer position) {

View File

@@ -97,6 +97,11 @@ public class StarboardPostManagementServiceBean implements StarboardPostManageme
@Override
public Optional<StarboardPost> findByStarboardPostId(Long postId) {
return repository.findById(postId);
}
@Override
public Optional<StarboardPost> findByStarboardPostMessageId(Long postId) {
return Optional.ofNullable(repository.findByStarboardMessageId(postId));
}

View File

@@ -17,10 +17,10 @@ import java.util.Optional;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class StarboardPostDeletedListenerTest {
public class StarboardMessagePostDeletedListenerTest {
@InjectMocks
private StarboardPostDeletedListener testUnit;
private StarboardMessagePostDeletedListener testUnit;
@Mock
private StarboardPostManagementService starboardPostManagementService;
@@ -28,7 +28,7 @@ public class StarboardPostDeletedListenerTest {
@Test
public void deleteNonStarboardPost() {
Long messageId = 4L;
when(starboardPostManagementService.findByStarboardPostId(messageId)).thenReturn(Optional.empty());
when(starboardPostManagementService.findByStarboardPostMessageId(messageId)).thenReturn(Optional.empty());
MessageDeletedModel model = Mockito.mock(MessageDeletedModel.class);
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
when(cachedMessage.getMessageId()).thenReturn(messageId);
@@ -46,7 +46,7 @@ public class StarboardPostDeletedListenerTest {
StarboardPost post = Mockito.mock(StarboardPost.class);
when(post.getSourceChannel()) .thenReturn(sourceChannel);
when(post.getPostMessageId()).thenReturn(postMessageId);
when(starboardPostManagementService.findByStarboardPostId(messageId)).thenReturn(Optional.of(post));
when(starboardPostManagementService.findByStarboardPostMessageId(messageId)).thenReturn(Optional.of(post));
CachedMessage cachedMessage = Mockito.mock(CachedMessage.class);
when(cachedMessage.getServerId()).thenReturn(serverId);
when(cachedMessage.getMessageId()).thenReturn(messageId);

View File

@@ -242,7 +242,7 @@ public class StarboardServiceBeanTest {
when(config.getLongValue()).thenReturn(1L);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LEVELS_CONFIG_KEY)).thenReturn(config);
when(defaultConfigManagementService.getDefaultConfig(StarboardFeature.STAR_LVL_CONFIG_PREFIX + 1)).thenReturn(config);
when(starboardPostManagementService.findByStarboardPostId(starboardPostId)).thenReturn(Optional.of(post));
when(starboardPostManagementService.findByStarboardPostMessageId(starboardPostId)).thenReturn(Optional.of(post));
when(userService.retrieveUserForId(STARRED_USER_ID)).thenReturn(CompletableFuture.completedFuture(starredJdaUser));
List<AUserInAServer > userExceptAuthor = new ArrayList<>();
CompletableFuture<Void> future = testUnit.updateStarboardPost(post, message, userExceptAuthor);

View File

@@ -179,7 +179,7 @@ public class StarboardPostManagementServiceBeanTest {
Long postId = 5L;
StarboardPost post = Mockito.mock(StarboardPost.class);
when(repository.findByStarboardMessageId(postId)).thenReturn(post);
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostId(postId);
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostMessageId(postId);
Assert.assertTrue(postOptional.isPresent());
postOptional.ifPresent(starboardPost -> Assert.assertEquals(starboardPost, post));
}
@@ -188,7 +188,7 @@ public class StarboardPostManagementServiceBeanTest {
public void testFindByStarboardPostIdMissing() {
Long postId = 5L;
when(repository.findByStarboardMessageId(postId)).thenReturn(null);
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostId(postId);
Optional<StarboardPost> postOptional = testUnit.findByStarboardPostMessageId(postId);
Assert.assertFalse(postOptional.isPresent());
}

View File

@@ -2,7 +2,7 @@ package dev.sheldan.abstracto.starboard.listener;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostUpdatedModel;
import dev.sheldan.abstracto.starboard.model.StarboardPostCreatedModel;
public interface StarboardPostUpdatedListener extends FeatureAwareListener<StarboardPostUpdatedModel, DefaultListenerResult> {
public interface StarboardPostCreatedListener extends FeatureAwareListener<StarboardPostCreatedModel, DefaultListenerResult> {
}

View File

@@ -0,0 +1,8 @@
package dev.sheldan.abstracto.starboard.listener;
import dev.sheldan.abstracto.core.listener.DefaultListenerResult;
import dev.sheldan.abstracto.core.listener.FeatureAwareListener;
import dev.sheldan.abstracto.starboard.model.StarboardPostDeletedModel;
public interface StarboardPostDeletedListener extends FeatureAwareListener<StarboardPostDeletedModel, DefaultListenerResult> {
}

View File

@@ -1,5 +0,0 @@
package dev.sheldan.abstracto.starboard.listener;
public enum StarboardPostState {
CREATED, UPDATED, UPDATED_CHANGED_THRESHOLD, DELETED
}

View File

@@ -3,7 +3,6 @@ package dev.sheldan.abstracto.starboard.model;
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerUser;
import dev.sheldan.abstracto.starboard.listener.StarboardPostState;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@@ -13,14 +12,13 @@ import java.util.List;
@Getter
@Setter
@Builder
public class StarboardPostUpdatedModel implements FeatureAwareListenerModel {
public class StarboardPostCreatedModel implements FeatureAwareListenerModel {
private ServerChannelMessage starredMessage;
private ServerChannelMessage starboardMessage;
private ServerUser starredUser;
private ServerUser lastStarrer;
private Long starboardPostId;
private List<Long> allStarrer;
private StarboardPostState newState;
@Override
public Long getServerId() {

View File

@@ -0,0 +1,27 @@
package dev.sheldan.abstracto.starboard.model;
import dev.sheldan.abstracto.core.listener.FeatureAwareListenerModel;
import dev.sheldan.abstracto.core.models.ServerChannelMessage;
import dev.sheldan.abstracto.core.models.ServerUser;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class StarboardPostDeletedModel implements FeatureAwareListenerModel {
private ServerChannelMessage starredMessage;
private ServerChannelMessage starboardMessage;
private ServerUser starredUser;
private ServerUser lastStarrer;
private Long starboardPostId;
private List<Long> allStarrer;
@Override
public Long getServerId() {
return starredUser.getServerId();
}
}

View File

@@ -20,6 +20,7 @@ public interface StarboardPostManagementService {
Integer getPostCount(Long serverId);
Optional<StarboardPost> findByMessageId(Long messageId);
Optional<StarboardPost> findByStarboardPostId(Long postId);
Optional<StarboardPost> findByStarboardPostMessageId(Long postId);
void setStarboardPostIgnored(Long starboardPostId, Boolean newValue);
boolean isStarboardPost(Long starboardPostId);
void removePost(StarboardPost starboardPost);