Skip to content

Commit

Permalink
Merge pull request #222 from SKY-HORSE-MAN-POWER/develop
Browse files Browse the repository at this point in the history
[DEPLOYMENT] `timeout` 제거했습니다.
  • Loading branch information
chanchanwoong authored Jun 25, 2024
2 parents 59ba54e + 73e0ce6 commit 6c1f070
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.skyhorsemanpower.auction.kafka.data.MessageEnum;
import com.skyhorsemanpower.auction.kafka.data.dto.AlarmDto;
import com.skyhorsemanpower.auction.kafka.data.dto.AuctionCloseDto;
import com.skyhorsemanpower.auction.quartz.data.MemberUuidsAndPrice;
import com.skyhorsemanpower.auction.repository.*;
import com.skyhorsemanpower.auction.common.exception.ResponseStatus;
import com.skyhorsemanpower.auction.data.dto.*;
Expand Down Expand Up @@ -71,12 +72,23 @@ public void auctionClose(String auctionUuid) {
return;
}

log.info("Auction Close Start");

// auction_history 도큐먼트를 조회하여 경매 상태를 변경
if (auctionHistoryRepository.findFirstByAuctionUuidOrderByBiddingTimeDesc(auctionUuid).isEmpty()) {
log.info("auction_history is not exist! No one bid at auction!");
producer.sendMessage(Topics.AUCTION_CLOSE.getTopic(), AuctionStateEnum.AUCTION_NO_PARTICIPANTS);
log.info("auction_history is not exist! No one bid the auction!");

// 아무도 참여하지 않은 경우에는 auctionUuid와 auctionState(AUCTION_NO_PARTICIPANTS) 전송
AuctionCloseDto noParticipantsAuctionCloseDto = AuctionCloseDto.builder()
.auctionUuid(auctionUuid)
.auctionState(AuctionStateEnum.AUCTION_NO_PARTICIPANTS)
.build();
log.info("No one bid the auction message >>> {}", noParticipantsAuctionCloseDto.toString());
producer.sendMessage(Topics.Constant.AUCTION_CLOSE, noParticipantsAuctionCloseDto);

// 경매 마감 여부 저장
auctionCloseStateRepository.save(AuctionCloseState.builder()
.auctionUuid(auctionUuid)
.auctionCloseState(true)
.build());
return;
}

Expand All @@ -93,36 +105,12 @@ public void auctionClose(String auctionUuid) {
long numberOfParticipants = lastRoundInfo.getNumberOfParticipants();

// 마감 로직
// 마지막 라운드 입찰 이력
List<AuctionHistory> lastRoundAuctionHistory = auctionHistoryRepository.
findByAuctionUuidAndRoundOrderByBiddingTime(auctionUuid, round);
log.info("Last Round Auction History >>> {}", lastRoundAuctionHistory.toString());

// 마지막 - 1 라운드 입찰 이력
List<AuctionHistory> lastMinusOneRoundAuctionHistory = auctionHistoryRepository.
findByAuctionUuidAndRoundOrderByBiddingTime(auctionUuid, round - 1);
log.info("Before Last Round Auction History >>> {}", lastMinusOneRoundAuctionHistory.toString());

// 마지막 라운드 입찰자를 낙찰자로 고정
Set<String> memberUuids = new HashSet<>();
for (AuctionHistory auctionHistory : lastRoundAuctionHistory) {
memberUuids.add(auctionHistory.getBiddingUuid());
}
MemberUuidsAndPrice memberUuidsAndPrice = getMemberUuidsAndPrice(
round, auctionUuid, numberOfParticipants);

// 마지막 직전 라운드 입찰자 중 낙찰자 추가
for (AuctionHistory auctionHistory : lastMinusOneRoundAuctionHistory) {
// 동일 입찰자 제외하고 추가
memberUuids.add(auctionHistory.getBiddingUuid());

// 낙찰 가능 인원 수 만큼 리스트 추가
if (memberUuids.size() == numberOfParticipants) break;
}

log.info("memberUuids >>> {}", memberUuids);

// 낙찰가는 마지막 이전 라운드에서 biddingPrice로 결정
BigDecimal price = lastMinusOneRoundAuctionHistory.get(0).getBiddingPrice();
log.info("price >>> {}", price);
// 낙찰가와 낙찰자 획득
Set<String> memberUuids = memberUuidsAndPrice.getMemberUuids();
BigDecimal price = memberUuidsAndPrice.getPrice();

// 카프카로 경매 서비스 메시지 전달
AuctionCloseDto auctionCloseDto = AuctionCloseDto.builder()
Expand All @@ -141,7 +129,7 @@ public void auctionClose(String auctionUuid) {
.message(MessageEnum.Constant.AUCTION_CLOSE_MESSAGE)
.eventType("경매")
.build();
log.info("Kafka Message To Alarm Service >>> {}", alarmDto.toString());
log.info("Auction Close Message To Alarm Service >>> {}", alarmDto.toString());

producer.sendMessage(Topics.Constant.ALARM, alarmDto);

Expand All @@ -152,6 +140,63 @@ public void auctionClose(String auctionUuid) {
.build());
}

private MemberUuidsAndPrice getMemberUuidsAndPrice(int round, String auctionUuid, long numberOfParticipants) {
Set<String> memberUuids = new HashSet<>();
BigDecimal price;

// 마지막 라운드 입찰 이력
List<AuctionHistory> lastRoundAuctionHistory = auctionHistoryRepository.
findByAuctionUuidAndRoundOrderByBiddingTime(auctionUuid, round);
log.info("Last Round Auction History >>> {}", lastRoundAuctionHistory.toString());

// 1라운드에서 경매가 마감된 경우
if (round == 1) {
log.info("One Round Close");
// 마지막 라운드 입찰자를 낙찰자로 고정
for (AuctionHistory auctionHistory : lastRoundAuctionHistory) {
memberUuids.add(auctionHistory.getBiddingUuid());
}

log.info("memberUuids >>> {}", memberUuids.toString());

// 낙찰가는 마지막 라운드에서 biddingPrice로 결정
price = lastRoundAuctionHistory.get(0).getBiddingPrice();
log.info("price >>> {}", price);
}

// 1라운드 제외한 라운드에서 경매가 마감된 경우
else {
log.info("{} Round Close", round);

// 마지막 - 1 라운드 입찰 이력
List<AuctionHistory> lastMinusOneRoundAuctionHistory = auctionHistoryRepository.
findByAuctionUuidAndRoundOrderByBiddingTime(auctionUuid, round - 1);
log.info("Before Last Round Auction History >>> {}", lastMinusOneRoundAuctionHistory.toString());

// 마지막 라운드 입찰자를 낙찰자로 고정
for (AuctionHistory auctionHistory : lastRoundAuctionHistory) {
memberUuids.add(auctionHistory.getBiddingUuid());
}

// 마지막 직전 라운드 입찰자 중 낙찰자 추가
for (AuctionHistory auctionHistory : lastMinusOneRoundAuctionHistory) {
// 동일 입찰자 제외하고 추가
memberUuids.add(auctionHistory.getBiddingUuid());

// 낙찰 가능 인원 수 만큼 리스트 추가
if (memberUuids.size() == numberOfParticipants) break;
}

log.info("memberUuids >>> {}", memberUuids.toString());

// 낙찰가는 마지막 이전 라운드에서 biddingPrice로 결정
price = lastMinusOneRoundAuctionHistory.get(0).getBiddingPrice();
log.info("price >>> {}", price);
}

return MemberUuidsAndPrice.builder().memberUuids(memberUuids).price(price).build();
}

@Override
public void auctionStateChangeTrue(String auctionUuid) {
RoundInfo roundInfo = roundInfoRepository.findFirstByAuctionUuidOrderByCreatedAtDesc(auctionUuid).orElseThrow(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package com.skyhorsemanpower.auction.kafka;

import org.apache.kafka.clients.admin.NewTopic;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.config.TopicConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.TopicBuilder;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
Expand All @@ -31,4 +34,22 @@ public ProducerFactory<String, Object> producerFactory() {
public KafkaTemplate<String, Object> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}

@Bean
public NewTopic auctionCloseTopic() {
return TopicBuilder.name(Topics.Constant.AUCTION_CLOSE)
.partitions(1)
.replicas(1)
.config(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(172800000))
.build();
}

@Bean
public NewTopic alarmTopic() {
return TopicBuilder.name(Topics.Constant.ALARM)
.partitions(1)
.replicas(1)
.config(TopicConfig.RETENTION_MS_CONFIG, String.valueOf(172800000))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void execute(JobExecutionContext context) throws JobExecutionException {
.auctionState(AuctionStateEnum.AUCTION_NO_PARTICIPANTS)
.build();
log.info("No one bid the auction message >>> {}", noParticipantsAuctionCloseDto.toString());
producer.sendMessage(Topics.AUCTION_CLOSE.getTopic(), noParticipantsAuctionCloseDto);
producer.sendMessage(Topics.Constant.AUCTION_CLOSE, noParticipantsAuctionCloseDto);

// 경매 마감 여부 저장
auctionCloseStateRepository.save(AuctionCloseState.builder()
Expand Down

0 comments on commit 6c1f070

Please sign in to comment.