반응형

 

 

Service 객체를 넣어주어서 시간마다 실행될 Method를 넣어준다.

이렇게 되면 20000 → 20초마다 계속 이 Method들을 불러와서 거래가 완료되었는지 점검해주고 체크를 해준다.

 

@Service
public class AuctionService {

	@Autowired
	private ItemsDao items_dao; // 경매 관련 데이터 접근 객체
	
	@Scheduled(fixedRate = 20000) // 5초마다 이 스케츌 Method를 실행시킨다
	public void checkAuctionStatus() {
		// 경매 종료를 확인하는 로직
		// auction_list_view를 가져와서 a_sledding (진행 여부)를 확인할 수 있다.
		List<ItemsVo> items = items_dao.findActiveAuction();
		
		// 진행 여부를 판가름 하기위해서 boolean Method를 가져와서 참거짓을 밝힌다.
		for(ItemsVo item : items) {
			
			// 만약에 현재 시간이 경매 마감시간을 넘어간다면,
			if(isAuctionEnded(item)) {
				
				int a_idx = item.getA_idx();
				
				// 경매 마감시간이 넘어간 요소의 진행 여부를 종료 시켜준다.
				int res = items_dao.update_auction_service_end(a_idx);
				
				// 필요한 추가 작업 (예: 알림발송등등) -- 추가질문요소
				//items_dao.updateAuctionEnd(item.getA_idx());
				
			}
		}
	}
	
	
	// 경매 종료 여부를 판단하는 로직
	private boolean isAuctionEnded(ItemsVo item) {
		
		// 경매 종료 시간을 String에서 Date Type으로 변환 시키기
		String endTimeString = item.getA_endtime();
		// 날짜 형식을 yyyy-MM-dd HH:mm:ss으로 출력한다.
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		
		try {
			Date endTime = dateFormat.parse(endTimeString);
			// Date Type으로 바꾼 현재 시간(new Date)를 비교한 참거짓값을 반환한다.
			return endTime.before(new Date());
		} catch (Exception e) {
			e.printStackTrace();
			return false;
			// TODO: handle exception
		}
	}
	
	
	
}

 

 

해당 Method에 사용된 Dao

 

	// AuctionService 객체 매순간 5초씩 경매 시간이 종료되었는지 확인해주는 로직
	public List<ItemsVo> findActiveAuction() {
		
		return sqlSession.selectList("items.findActiveAuction");
	}
	
	// 현재시간이 마감시간을 넘어선 객체를 거래종료 시켜준다.
	public int update_auction_service_end(int a_idx) {
		
		return sqlSession.update("items.update_auction_service_end", a_idx);
	}

 

 

해당 mapper로 사용된 items.xml

	<!-- 5초동안 List에서 경매조건이 끝나거나 끝나있지 않은 항목들 검색해서 가져오기 -->
	<select id="findActiveAuction" resultType="items">
		select * from auction_list_view
	</select>
	

	
	<!-- 경매 마감시간이 넘어간 요소의 진행 여부를 종료 시켜준다. -->
	<update id="update_auction_service_end" parameterType="int">
		update auction
		set a_sledding = 'n'
		where a_idx = #{ a_idx }
	</update>

 

 

 

 

여기서 오류잡기! 이런 오류들이 계속 console에 찍히는데,

End time is null for item: 68

End time is null for item: 67

End time is null for item: 66

End time is null for item: 65

End time is null for item: 51

End time is null for item: 69

End time is null for item: 68

End time is null for item: 67

End time is null for item: 66

End time is null for item: 65

End time is null for item: 51

End time is null for item: 69

End time is null for item: 68

End time is null for item: 67

End time is null for item: 66

End time is null for item: 65

End time is null for item: 51

 

 

 

 

요렇게 종료예정 시간이 들어가있지 않은거 (a_endtime) 때문에, 오류가 console에 입력이 된다.

반응형