Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

아주 간결한 코드로, 서비스 코드내에서 적은 코드로 활용이 가능합니다.


배치를 위한 DBWrite 구현

Code Block
languagejava
themeEmacs
@Component("DBWriteActor")
@Scope("prototype")
public class DBWriteActor extends AbstractActor{
    private final LoggingAdapter log = Logging.getLogger(getContext().system(), "DBWriteActor");
    
	@Autowired
	ItemBuyLogRepository itemBuyLogRepository;
    
    @Override
    public Receive createReceive() {
      return receiveBuilder()
        .match(  com.psmon.cachedb.actors.fsm.Batch.class , s -> {
          log.info("Received ItemBuyLog message: {}", s.toString()  );                              
          List<ItemBuyLog> insertList = new ArrayList<>();          
          s.getList().forEach( item-> {
        	  ItemBuyLog itemLog = (ItemBuyLog)item;
        	  insertList.add(itemLog);        	  
          });
          itemBuyLogRepository.save( insertList );        	
        })
        .matchAny(o -> log.info("received unknown message - {}", o.getClass().getName()  ))
        .build();
    }
}

DB에 Row를 저장하기위해 건바이건마다 트랜잭션이 발생하는 방식이아닌

JPA를 활용하여 리스트를 그대로 저장할수 있는 인터페이스와 연동되었습니다.

JPA(ORM)는 DB를 데이터중심에서 메시지중심방식으로 사용하기위한 유용한 DB개발방식입니다.

추가참조: 02-DBHANDLE with JPA

활용코드

Code Block
languagejava
themeEmacs
	protected void fsmDBWriteTest(ActorSystem system,SpringExtension ext) {
	    new TestKit(system) {
		{
	        final ActorRef buncher =
	          system.actorOf(ext.props("buncher"));
	        
	        final ActorRef dbWriter =
	  	          system.actorOf(ext.props("DBWriteActor"));
	        
	        final ActorRef probe = getRef();
	        
	        buncher.tell(new SetTarget(dbWriter), dbWriter);
	        
			for(int i=0;i<200;i++) {				
				String buyTime = String.format("2018-%02d-%02d", i%10+1,i%20+1);			
				UserInfo buyUser = userInfoRepository.findAll().get(i%50);
				GameItem buyItem = gameItemRepository.findAll().get(i%50);			
				ItemBuyLog addBuyLog = new ItemBuyLog(buyTime, buyItem, buyUser);				
				buncher.tell(new Queue(addBuyLog), dbWriter);
			}
			
			buncher.tell(Flush.Flush , dbWriter);
			
			 system.stop(buncher);
	      }};
	}

원하는 처리량부분에 Flush를 수행하면 현재까지 수집된 Row를 List화하여 DB에 저장시도를 할수가 있습니다.

지정된 특정시간이 지나면, 수집된량에 상관없이 Flush를 자동 수행하기때문에 유입된 메시지를 모두 처리할수가 있습니다.