@Configuration
public class ThreadPoolConfig {
@Bean ( name = "eventThreadPool" )
public ThreadPoolTaskExecutor eventThreadPool ( ) {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor ( ) ;
executor. setCorePoolSize ( 8 ) ;
executor. setMaxPoolSize ( 10 ) ;
executor. setQueueCapacity ( 1500 ) ;
executor. setThreadNamePrefix ( "eventThreadPool_" ) ;
executor. setRejectedExecutionHandler ( new ThreadPoolExecutor. CallerRunsPolicy ( ) ) ;
executor. setKeepAliveSeconds ( 60 ) ;
executor. initialize ( ) ;
return executor;
}
}
@Component
public class EventQueueConsumer implements InitializingBean , ApplicationContextAware {
@Autowired
StringRedisTemplate redisTemplate;
@Resource ( name = "eventThreadPool" )
ThreadPoolTaskExecutor eventThreadPool;
private ApplicationContext applicationContext;
private final static Logger LOGGER = LoggerFactory. getLogger ( EventQueueConsumer. class ) ;
private Map< String, List< EventHandler>> eventConfig = new HashMap < > ( ) ;
@Override
public void afterPropertiesSet ( ) throws Exception {
Map< String, EventHandler> handlerBeans = applicationContext. getBeansOfType ( EventHandler. class ) ;
if ( handlerBeans != null ) {
for ( Map. Entry< String, EventHandler> entry : handlerBeans. entrySet ( ) ) {
String eventType = entry. getValue ( ) . getSupportedEvents ( ) ;
if ( ! eventConfig. containsKey ( eventType) ) {
eventConfig. put ( eventType, new ArrayList < EventHandler> ( ) ) ;
}
eventConfig. get ( eventType) . add ( entry. getValue ( ) ) ;
}
}
new Thread ( ( ) - > {
while ( true ) {
String jsonStr = redisTemplate. opsForList ( ) . rightPop ( RedisKeys. TOPIC_EVENTQUEUE , 1 , TimeUnit. SECONDS ) ;
LOGGER . info ( "弹出元素:{}" , jsonStr) ;
if ( StringUtils. isNotBlank ( jsonStr) ) {
eventThreadPool. submit ( ( ) - > {
EventModel eventModel = JSON . parseObject ( jsonStr, EventModel. class ) ;
LOGGER . info ( "处理任务:{}" , eventModel) ;
if ( eventConfig. containsKey ( eventModel. getEventType ( ) ) ) {
for ( EventHandler eventHandler : eventConfig. get ( eventModel. getEventType ( ) ) ) {
eventHandler. doHandle ( eventModel) ;
}
}
} ) ;
}
}
} ) . start ( ) ;
}
@Override
public void setApplicationContext ( ApplicationContext applicationContext) throws BeansException {
this . applicationContext = applicationContext;
}
}
public interface EventHandler {
void doHandle ( EventModel eventModel) ;
String getSupportedEvents ( ) ;
}
@Component
public class UserShareHandler implements EventHandler {
public static final HashMap< String, Integer> EVENT_MAP = new HashMap < > ( ) ;
static {
EVENT_MAP . put ( EventType. USER_SHARE , 2 ) ;
EVENT_MAP . put ( EventType. MERCHANT_SHARE , 2 ) ;
}
private Logger logger = LoggerFactory. getLogger ( this . getClass ( ) ) ;
@Autowired
UserCouponMapper userCouponMapper;
@Autowired
MessageMapper messageMapper;
@Autowired
OperateActivityMapper operateActivityMapper;
@Override
public void doHandle ( EventModel eventModel) {
if ( StringUtils. isNotBlank ( eventModel. getEventType ( ) ) && eventModel. getEventType ( ) . equals ( EventType. USER_SHARE ) ) {
Message message = messageMapper. selectOne ( new LambdaQueryWrapper < Message> ( )
. eq ( Message: : getMsgNum, eventModel. getMsgNum ( ) ) ) ;
message. setIsConsume ( 1 ) ;
messageMapper. updateById ( message) ;
logger. info ( "消费消息:{}" , eventModel) ;
Long userId = eventModel. getTriggerId ( ) ;
Integer event = EVENT_MAP . get ( eventModel. getEventType ( ) ) ;
Wrapper< OperateActivity> wrapper = new LambdaQueryWrapper < OperateActivity> ( )
. eq ( OperateActivity: : getEvent, event)
. eq ( OperateActivity: : getUserType, 1 )
. eq ( OperateActivity: : getType, 1 )
. gt ( OperateActivity: : getEndTime, System. currentTimeMillis ( ) / 1000 )
. lt ( OperateActivity: : getStartTime, System. currentTimeMillis ( ) / 1000 ) ;
List< OperateActivity> operateActivities = operateActivityMapper. selectList ( wrapper) ;
for ( OperateActivity operateActivity : operateActivities) {
Long activityId = operateActivity. getId ( ) ;
BigDecimal money = operateActivity. getMoney ( ) ;
Integer number = operateActivity. getNumber ( ) ;
Long termOfValidity = operateActivity. getTermOfValidity ( ) ;
for ( int i = 0 ; i < number; i++ ) {
UserCoupon userCoupon = new UserCoupon ( ) ;
userCoupon. setActivityId ( activityId) ;
userCoupon. setType ( 1 ) ;
userCoupon. setMoney ( money) ;
userCoupon. setUserId ( userId) ;
userCoupon. setStartTime ( System. currentTimeMillis ( ) / 1000 ) ;
userCoupon. setEndTime ( System. currentTimeMillis ( ) / 1000 + termOfValidity* 3600 ) ;
userCouponMapper. insert ( userCoupon) ;
}
}
}
}
@Override
public String getSupportedEvents ( ) {
return EventType. USER_SHARE ;
}
}
**
* 事件模型(可使用链式编程创建)
* /
public class EventModel implements Serializable {
private String eventType;
private Long triggerId;
private Long receiverId;
private String msgNum;
private Long exTime;
private Long createTime;
private Map< String, Object> extraInfo = new HashMap < String, Object> ( ) ;
public String getEventType ( ) {
return eventType;
}
public Long getTriggerId ( ) {
return triggerId;
}
public Long getReceiverId ( ) {
return receiverId;
}
public Map< String, Object> getExtraInfo ( ) {
return extraInfo;
}
public Long getExTime ( ) {
return exTime;
}
public String getMsgNum ( ) {
return msgNum;
}
public Long getCreateTime ( ) {
return createTime;
}
public EventModel setEventType ( String eventType) {
this . eventType = eventType;
return this ;
}
public EventModel setTriggerId ( Long triggerId) {
this . triggerId = triggerId;
return this ;
}
public EventModel setReceiverId ( Long receiverId) {
this . receiverId = receiverId;
return this ;
}
public EventModel setExtraInfo ( Map< String, Object> extraInfo) {
this . extraInfo = extraInfo;
return this ;
}
public EventModel setMsgNum ( String msgNum) {
this . msgNum = msgNum;
return this ;
}
public EventModel setExTime ( Long exTime) {
this . exTime = exTime;
return this ;
}
public EventModel setCreateTime ( Long createTime) {
this . createTime = createTime;
return this ;
}
@Override
public String toString ( ) {
return "EventModel{" +
"eventType='" + eventType + '\'' +
", triggerId=" + triggerId +
", receiverId=" + receiverId +
", msgNum='" + msgNum + '\'' +
", exTime=" + exTime +
", createTime=" + createTime +
", extraInfo=" + extraInfo +
'}' ;
}
}
public class EventType {
public static final String USER_SHARE = "USER_SHARE" ;
public static final String MERCHANT_SHARE = "MERCHANT_SHARE" ;
}
@Component
public class EventProducer {
private Logger logger = LoggerFactory. getLogger ( this . getClass ( ) ) ;
@Autowired
RedisTemplate redisTemplate;
@Autowired
MessageMapper messageMapper;
public boolean pushEvent ( EventModel eventModel) {
redisTemplate. opsForList ( ) . leftPush ( RedisKeys. TOPIC_EVENTQUEUE , eventModel) ;
logger. debug ( "生产消息:{}" , eventModel) ;
Message message = new Message ( ) ;
BeanUtil. copyProperties ( eventModel, message) ;
message. setUserId ( eventModel. getTriggerId ( ) ) ;
message. setExtraInfo ( JSONUtil. toJsonStr ( eventModel. getExtraInfo ( ) ) ) ;
message. setTopic ( RedisKeys. TOPIC_EVENTQUEUE ) ;
messageMapper. insert ( message) ;
return true ;
}
}