Page History
...
아주 간결한 코드로, 서비스 코드내에서 적은 코드로 활용이 가능합니다.
배치를 위한 DBWrite 구현
Code Block | ||||
---|---|---|---|---|
| ||||
@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 | ||||
---|---|---|---|---|
| ||||
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를 자동 수행하기때문에 유입된 메시지를 모두 처리할수가 있습니다.