Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,5 @@ out/

application*.properties
schema
test.html
test.html
TestController.java
4 changes: 4 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ dependencies {
testImplementation 'org.awaitility:awaitility'

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

// rabbitmq
implementation 'org.springframework.boot:spring-boot-starter-amqp'
testImplementation 'org.springframework.amqp:spring-rabbit-test'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.fffserver.domain.answer.domain.messagingQueue;

import java.util.List;
import lombok.Getter;

@Getter
public class AnswerQueueListRequestDto {

private List<AnswerQueueRequestDto> answerList;

// 필드 1개인 경우 Jackson 이슈
public AnswerQueueListRequestDto() {
}

public AnswerQueueListRequestDto(List<AnswerQueueRequestDto> answerList) {
this.answerList = answerList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.example.fffserver.domain.answer.domain.messagingQueue;

import lombok.Getter;

@Getter
public class AnswerQueueRequestDto {

private String answerId;
private String userId;
private String content;
private String formId;
private String questionId;

public AnswerQueueRequestDto() {
}

public AnswerQueueRequestDto(String answerId, String userId, String content, String formId,
String questionId) {
this.answerId = answerId;
this.userId = userId;
this.content = content;
this.formId = formId;
this.questionId = questionId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.example.fffserver.domain.answer.domain.messagingQueue;

import com.example.fffserver.domain.answer.application.AnswerService;
import com.example.fffserver.domain.answer.domain.entity.Answer;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.charset.StandardCharsets;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

// TODO: RabbitMQ -> 카프카로 변경
@Component
@Slf4j
public class Consumer {

private AnswerService answerService;

public Consumer(AnswerService answerService) {
this.answerService = answerService;
}

@RabbitListener(queues = "answer.queue")
public void consume(Message message) throws JsonProcessingException {
String messageString = new String(message.getBody(), StandardCharsets.UTF_8);

ObjectMapper objectMapper = new ObjectMapper();
AnswerQueueListRequestDto answerQueueListRequestDto = objectMapper.readValue(messageString,
AnswerQueueListRequestDto.class);

log.info("answerId: {}", answerQueueListRequestDto.getAnswerList().get(0).getAnswerId());
log.info("userId: {}", answerQueueListRequestDto.getAnswerList().get(0).getUserId());
log.info("content: {}", answerQueueListRequestDto.getAnswerList().get(0).getContent());

// TODO: DB 삽입
}

// DB insert
public void insert(List<Answer> answerList) {
answerService.mappedQuestionAndInsert(answerList);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.fffserver.domain.answer.domain.messagingQueue;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

@Component
public class Producer {

private final RabbitTemplate rabbitTemplate;

public Producer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}

public void sendMessage(AnswerQueueListRequestDto message) {
rabbitTemplate.convertAndSend("answer.exchange", "answer.key", message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.example.fffserver.global.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitmqConfig {

@Value("${spring.rabbitmq.host}")
private String host;

@Value("${spring.rabbitmq.username}")
private String username;

@Value("${spring.rabbitmq.password}")
private String password;

@Value("${spring.rabbitmq.port}")
private int port;

@Bean
Queue queue() {
return new Queue("answer.queue", false);
}

@Bean
DirectExchange directExchange() {
return new DirectExchange("answer.exchange");
}

@Bean
Binding binding(DirectExchange directExchange, Queue queue) {
return BindingBuilder.bind(queue).to(directExchange).with("answer.key");
}

@Bean
RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter);
return rabbitTemplate;
}

@Bean
ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(host);
connectionFactory.setPort(port);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}

@Bean
MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}

@Bean
SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setMessageConverter(messageConverter());
return factory;
}
}