2.0����Scala�ɑΉ�����Web�A�v���J���̐l�C�y�ʃt���[�����[�N�uPlay�v�ɂ��ĉ�����AWeb�A�v���̍������Љ�����A�ځB����́AEHCache���g���L���b�V���@�\�A��HTTP�ʐM�AGoogle Closure Compiler���g��JavaScript�̍œK���ARequireJS���g��JavaScript�ˑ��W�̉������@�ɂ��ĉ�����܂��B
�@�O��̋L���uPlay2�ɂ�����JSON�����CoffeeScript�̎g�����v�ł́APlay2��JSON��CoffeeScript���g�p������@���Љ�܂����B
�@������APlay2�ł悭�g�p�����ł��낤�A�ȉ��̂��܂��܂ȋ@�\���Љ�܂��B
�@�A�ڑ�5��́uPlay 2.1�ɃA�b�v�O���[�h���ăR���g���[�����g�����Ȃ��v�ł́APlay2�Ŏg�p����u�Z�b�V�����v�u�t���b�V���X�R�[�v�v�Ƃ����A�f�[�^�������ԕێ����邽�߂̋@�\�ɂ��Đ������܂����B
�@�����ł��q�ׂĂ��܂����APlay2�̃L���b�V���@�\�ɂ́A�ȉ��̂悤�Ȑ���������܂��B
�@Java EE�iJ2EE�j�ł����uHTTP�Z�b�V�����v�̂悤�ȋ@�\�́APlay��Cache API���g�p���邱�ƂŎ����ł���Ƃ����܂����B�����ŁA����Cache API�ɂ��Đ������܂��傤�B
�@�Ȃ��APlay2�ɂ�����Cache API�̃f�t�H���g�����́uEHCache�v�ł��B����ȊO�̎������v���O�C���ŗ��p�\�ł��B
�@�L���b�V���@�\���g�p����ɂ́Aplay.api.Application�I�u�W�F�N�g���K�v�ł��B���̂��߁Aplay.api.Play.current��import���Ă����K�v������܂��B�L���b�V���ւ̕ۑ��^���o���́A���L�̂悤�ɊȒP�ɍs���܂��B
import play.api.Play.current import play.api.cache.Cache class Point(x:Int,y:Int) �E �E �E Cache.set("point1", Point(3,6),<�L�������̕b��>) val opt: Option[Point] = Cache.getAs[Point]("point1")
�@cache���Z�b�V�����Ɠ������A�P����key/value�̃X�g�A�ł����A������ȊO�ɂ��I�u�W�F�N�g�Ȃǂ̂��܂��܂ȃf�[�^��ۑ��ł��܂��B
�@�܂��Aset���̑�3�����ɐ��l���w�肷�邱�ƂŁACache�̗L��������ݒ�ł��܂��i���L�������̕b���̓I�v�V�����j�B
�@����ɁAgetOrElse����Cache����l�����o�����Ƃ��ł��܂��B���̊����g�p����ƁA�l��������Ȃ��ꍇ�ɂ͑�2�����̒l���v�Z���A������L���b�V���Ɋi�[������ŕԂ��܂��B
val p:Point = Cache.getOrElse("point1",<�L�������̕b��>) { //�L���b�V����������Ȃ��ꍇ�͂��̒l��ۑ����ĕԂ� new Point(0,0) }
�@�Ȃ��L���b�V���ɂ��ẮA�����T�C�g�̉�����Q�l�ɂ��Ă��������B
�@Play�A�v���ɂ����āAAction�Ăяo���͂ł�����葬���������ă��X�|���X���N���C�A���g�ɕԂ��Ȃ�������܂���B�������A�����ɂ���Ă͔��ɏd���v�Z���s������A���X�|���X���\���ł��Ȃ��O��Web�T�[�r�X�Ɉˑ������肷�邱�Ƃ�����ł��傤�B
�@�����������A���X�|���X���܂������ł��Ȃ��ꍇ�́AFuture�I�u�W�F�N�g���g�p���܂��B���X�|���X�Ƃ��āuFuture[Result]�v��Ԃ����ƂŁA�ŏI�I��Result�^�̒l��ۏł��܂��B
�@�ʏ��Result�̑����Future[Result]��Ԃ��A�������u���b�N�����ɑ����Ɍ��ʂ�Ԃ��A�ʂ̏��������s���邱�Ƃ��\�ł��B�A�v����Future��Ԃ���������Ŋ��������Ƃ��A����ꂽ���ʁiResult�j���N���C�A���g�֑��M���܂��B
�@Future[Result]������ɂ́A���ƂȂ�Future����ɕK�v�ł��B����Future���擾�����^�C�~���O�ŁAFuture[Result]���擾���A�N���C�A���g�Ɍ��ʂ�Ԃ��܂��B
//���v�Z���������s val futureSrcValue: Future[Int] = calcAsync() //futureSrcValue�����ۂ̒l���擾�ł���悤�ɂȂ�����A���X�|���X���@ val futureResult: Future[Result] = futureSrcValue.map { num => Ok("Number : " + num) }
�@��L�̗�ł�calcAsync����Future�I�u�W�F�N�g���擾���܂��B���̎��ۂ̒l���擾�\�ɂȂ�����A�uOk�v���N���C�A���g�ɕԂ��Ă��܂��B
�@��q����WS API��AAkka API���g�����������A�A�N�^�[�ƒʐM����ꍇ�Ȃǂ́A�S��Future���擾���Ĕ��������s���܂��B
�@�Ȃ��A�R�[�h�u���b�N����Ŏ��s����Future���擾����ȒP�ȕ��@�͉��L�̂悤�ɂȂ�܂��B
val futureInt: Future[Int] = scala.concurrent.Future { intensiveComputation() }
�@���������A�N�V�����Ŏ��s����ɓ������āA����1�K�v�Ȃ��Ƃ�����܂��B���܂܂ŃA�N�V�����̖߂�l�ɂ́ASimpleResult���g�p���Ă��܂������A�����ʂ�Ԃ����߂ɂ́ASimpleResult�����b�v����AsyncResult���g���܂��B
def sample = Action { val future = scala.concurrent.Future { caclSomething() } //Async�u���b�N��Future[Result]����AsyncResult���쐬���郁�\�b�h Async { future.map(i => Ok("result: " + i)) } }
�@��L�̂悤��Async�u���b�N���g�p����ƁA�ŏI�I��Action��AsyncResult�����悤�ɂȂ�܂��B
�@ws���C�u�������g�p���ĊO���T�[�r�X���Ăяo���āAFuture�̓�����m�F���Ă݂܂��傤�B
�@Future���g�p�����������̃T���v�����쐬���Ă݂܂��B�܂��́Aconf/routes�t�@�C���ɐV�����R���g���[����o�^���܂��B
GET /asyncSample controllers.AsyncController.index()
�@���ɁAaction�N���X���쐬���܂��Baction�ł́Aplay.api.libs.ws.WS�I�u�W�F�N�g���g�p���āA�O���T�C�g�iJSON���X�|���X��Ԃ��T�C�g�j�ɐڑ����Ă��܂��B
�@WS�ɂ��HTTP�ʐM�́AFuture[play.api.libs.ws.Response]��Ԃ����߁A�������ƂȂ�܂��B
package controllers import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.Future import play.api.libs.ws import play.api.libs.ws.WS import play.api.mvc.Action import play.api.mvc.Controller object AsyncController extends Controller { def index = Action { Async { //�O���T�[�r�X���烌�X�|���X�f�[�^���擾 val jsonFeed: Future[ws.Response] = WS.url("http://isaacs.couchone.com/registry/_all_docs").get() //�O���T�[�r�X�̏��������Ă���ԁA���̏������s�� calc jsonFeed map { response => Ok(response.body) } } } private def calc() { for (i <- 1 to 5) { println("calc:" + i) Thread.sleep(1000) } } }
�@�O���T�[�o�փA�N�Z�X���Ă��錄�ɁAcalc�����Ăяo���ĕʏ����i1�b���ƂɃR���\�[���\���j���s���Ă��܂��B�O���A�N�Z�X�����ōs���Ă���Ԃɏ������Ă���̂ŁA���ʂ�҂��ƂȂ�calc�������s���āA���ʎ擾��A�N���C�A���g�Ƀ��X�|���X��Ԃ����Ƃ��ł��܂��B
�@Web�A�v���ł������̕���������O�ɂȂ��Ă��Ă�������A�T�[�o�̏������u���b�N���Ȃ��������̎��s�͏d�v�Ȏ�@�ɂȂ��Ă��܂��B�����ɂ���A�ȉ��̃h�L�������g���Q�l�ɂ��Ă݂Ă��������B
Copyright © ITmedia, Inc. All Rights Reserved.