* @version : HuoMp 1.0
*/
namespace huolib\queue\job;
use huo\model\member\MemGameModel;
use huolib\constant\CacheConst;
use huolib\constant\IaConst;
use huolib\constant\MemConst;
use huolib\tool\Time;
use huomp\controller\member\MemberOut;
use huomp\model\log\OpenGameModel;
use think\Cache;
use think\Log;
use think\queue\Job;
class OpenGameFire extends Fire {
static $g_i = 0;
/**
* fire方法是消息队列默认调用的方法
*
* @param Job $job 当前的任务对象
* @param array|mixed $data 发布任务时自定义的数据
*/
public function fire(Job $job, $data) {
if ($job->attempts() > 1) {
$job->delete();
}
self::$g_i++;
$_is_job_done = $this->doJob($data);
$runtime = round(microtime(true) - THINK_START_TIME, 10);
echo $runtime.' '.self::$g_i;
if ($_is_job_done) {
//如果任务执行成功, 记得删除任务
$job->delete();
// print("Hello Job has been done and deleted"."\n");
} else {
if ($job->attempts() > 3) {
//通过这个方法可以检查这个任务已经重试了几次了
// print("Hello Job has been retried more than 3 times!"."\n");
$job->delete();
// 也可以重新发布这个任务
// print("Hello Job will be availabe again after 2s."."\n");
//$job->release(2); //$delay为延迟时间,表示该任务延迟2秒后再执行
}
}
}
/**
* 根据消息中的数据进行实际的业务处理
*
* @param array $data 发布任务时自定义的数据
*
* @return bool 任务执行的结果
*/
public function doJob($data) {
$_cache_key = CacheConst::CACHE_MEM_OPEN_GAME_PREFIX.md5(json_encode(array($data['mem_id'], $data['game_id'])));
$_cache = Cache::get($_cache_key);
$_time = time();
\think\Log::write(array($data,$_cache),'error',true);
if (!empty($_cache) && MemConst::OPEN_GAME_STATUS_2 == $_cache['status']) {
$_mem_game_model = new MemGameModel();
list($today_start, $today_end) = Time::today();
$_rs = $_mem_game_model->hasOpen($data['mem_id'], $data['game_id'], $today_start);
if (true != $_rs) {
$_ext = ['app_id' => $data['app_id'], 'game_id' => $data['game_id']];
(new MemberOut())->setPlayCnt($data['mem_id'], 1, IaConst::IA_STATUS_NOT, $_ext);
$_mem_game_model->rmHasOpen($data['mem_id'], $data['game_id'], $today_start);
}
$_data['status'] = $_cache['status'];
}
$_data['end_time'] = $_time;
$_data['duration'] = $_time - $_cache['start_time'];
$_og_model = (new OpenGameModel());
$_og_map = [
'date' => date('Y-m-d', $_time),
'mem_id' => $data['mem_id'],
'game_id' => $data['game_id'],
];
$_og_data = $_og_model->where($_og_map)->find()->toArray();
if (!empty($_og_data)) {
$_og_data['start_time'] = $data['start_time'];
$_og_data['status'] = $_cache['status'];
$_og_data['end_time'] = $_time;
$_og_data['duration'] = $_time - $_cache['start_time'];
$_og_data['update_time'] = $_time;
$_map = ['id' => $_og_data['id']];
$_rs = $_og_model->save($_og_data, $_map);
} else {
$_rs = $_og_model->insertLog($_data);
}
if (false == $_rs) {
Log::write(
"func=".__FUNCTION__."&class=".__CLASS__."step=".self::$g_i."&msg=".json_encode($_rs)."&data="
.json_encode($data),
LOG::QUEUE
);
}
if (MemConst::OPEN_GAME_STATUS_1 == $_cache['status']) {
Cache::rm($_cache_key);
}
return true;
}
}