最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring整合websocket整合應(yīng)用示例(下)

 更新時間:2016年04月05日 09:59:31   作者:Bridge Li  
這篇文章主要介紹了Spring整合websocket整合應(yīng)用示例(下)的相關(guān)資料,需要的朋友可以參考下

在Spring整合websocket整合應(yīng)用示例(上)文章中,我們已經(jīng)實現(xiàn)了websocket,但還有一個核心的業(yè)務(wù)實現(xiàn)類沒有實現(xiàn),這里我們就實現(xiàn)這個業(yè)務(wù)核心類,因為老夫參與的這個系統(tǒng)使用websocket發(fā)送消息,所以其實現(xiàn)就是如何發(fā)送消息了。

7. NewsListenerImpl的實現(xiàn)

package cn.bridgeli.websocket;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.lagou.common.base.util.date.DateUtil;
import com.lagou.platform.news.api.enumeration.PlatNewsCategoryType;
import com.lagou.platform.news.web.dao.ext.model.PlatNewsVo;
import com.lagou.platform.news.web.dao.ext.model.SearchCondition;
import com.lagou.platform.news.web.quartz.impl.TimingJob;
import com.lagou.platform.news.web.service.PlatNewsService;
import org.apache.commons.lang.StringUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Description : 站內(nèi)消息監(jiān)聽器實現(xiàn)
* @Date : 16-3-7
*/
@Component
public class NewsListenerImpl implements NewsListener{
private static final Logger logger = LoggerFactory.getLogger(NewsListenerImpl.class);
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
//線程池
private ExecutorService executorService = Executors.newCachedThreadPool();
//任務(wù)調(diào)度
private SchedulerFactory sf = new StdSchedulerFactory();
@Autowired
private PlatNewsService platNewsService;
@Override
public void afterPersist(PlatNewsVo platNewsVo) {
logger.info("監(jiān)聽到有新消息添加。。。");
logger.info("新消息為:"+gson.toJson(platNewsVo));
//啟動線程
if(null != platNewsVo && !StringUtils.isBlank(platNewsVo.getCurrentoperatoremail())){
//如果是定時消息
if(platNewsVo.getNewsType() == PlatNewsCategoryType.TIMING_TIME.getCategoryId()){
startTimingTask(platNewsVo); //定時推送
}else{
//立即推送
executorService.execute(new AfterConnectionEstablishedTask(platNewsVo.getCurrentoperatoremail()));
}
}
}
@Override
public void afterConnectionEstablished(String email) {
logger.info("建立websocket連接后推送新消息。。。");
if(!StringUtils.isBlank(email)){
executorService.execute(new AfterConnectionEstablishedTask(email));
}
}
/**
* @Description : 如果新添加了定時消息,啟動定時消息任務(wù)
* @param platNewsVo
*/
private void startTimingTask(PlatNewsVo platNewsVo){
logger.info("開始定時推送消息任務(wù)。。。");
Date timingTime = platNewsVo.getTimingTime();
if(null == timingTime){
logger.info("定時消息時間為null。");
return;
}
logger.info("定時推送任務(wù)時間為:"+DateUtil.date2String(timingTime));
JobDetail jobDetail= JobBuilder.newJob(TimingJob.class)
.withIdentity(platNewsVo.getCurrentoperatoremail()+"定時消息"+platNewsVo.getId(), "站內(nèi)消息")
.build();
//傳遞參數(shù)
jobDetail.getJobDataMap().put("platNewsService",platNewsService);
jobDetail.getJobDataMap().put("userEmail",platNewsVo.getCurrentoperatoremail());
Trigger trigger= TriggerBuilder
.newTrigger()
.withIdentity("定時消息觸發(fā)"+platNewsVo.getId(), "站內(nèi)消息")
.startAt(timingTime)
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(0) //時間間隔
.withRepeatCount(0) //重復(fù)次數(shù)
)
.build();
//啟動定時任務(wù)
try {
Scheduler sched = sf.getScheduler();
sched.scheduleJob(jobDetail,trigger);
if(!sched.isShutdown()){
sched.start();
}
} catch (SchedulerException e) {
logger.info(e.toString());
}
logger.info("完成開啟定時推送消息任務(wù)。。。");
}
/**
* @Description : 建立websocket鏈接后的推送線程
*/
class AfterConnectionEstablishedTask implements Runnable{
String email ;
public AfterConnectionEstablishedTask(String email){
this.email = email;
}
@Override
public void run() {
logger.info("開始推送消息給用戶:"+email+"。。。");
if(!StringUtils.isBlank(email)){
SearchCondition searchCondition = new SearchCondition();
searchCondition.setOperatorEmail(email);
JSONArray jsonArray = new JSONArray();
for(PlatNewsCategoryType type : PlatNewsCategoryType.values()){
searchCondition.setTypeId(type.getCategoryId());
int count = platNewsService.countPlatNewsByExample(searchCondition);
JSONObject object = new JSONObject();
object.put("name",type.name());
object.put("description",type.getDescription());
object.put("count",count);
jsonArray.add(object);
}
if(null != jsonArray && jsonArray.size()>0){
UserSocketVo userSocketVo = WSSessionLocalCache.get(email);
TextMessage reMessage = new TextMessage(gson.toJson(jsonArray));
try {
if(null != userSocketVo){
//推送消息
userSocketVo.getWebSocketSession().sendMessage(reMessage);
//更新推送時間
userSocketVo.setLastSendTime(DateUtil.getNowDate());
logger.info("完成推送新消息給用戶:"+userSocketVo.getUserEmail()+"。。。");
}
} catch (IOException e) {
logger.error(e.toString());
logger.info("站內(nèi)消息推送失敗。。。"+e.toString());
}
}
}
logger.info("結(jié)束推送消息給"+email+"。。。");
}
}
}

這個類就是websocket的核心業(yè)務(wù)的實現(xiàn),其具體肯定和業(yè)務(wù)相關(guān),由于業(yè)務(wù)的不同,實現(xiàn)肯定不同,因為老夫參與的系統(tǒng)是發(fā)送消息,所以里面最核心的一句就是:

userSocketVo.getWebSocketSession().sendMessage(reMessage);

通過WebSocketSession的sendMessage方法把我們的消息發(fā)送出去。另外,這主要是后端的實現(xiàn),至于前端的實現(xiàn),因為老夫是后端程序猿比較關(guān)注后端,所以前端就不多做介紹了,大家可以自己去網(wǎng)上查資料。最后需要說明的是,老夫之前搜一些學(xué)習(xí)資料的時候,發(fā)現(xiàn)老夫該同事的寫法和有一篇文章幾乎一樣,我想該同事應(yīng)該是參考了這篇文章,所以列在下面,算作參考資料。

相關(guān)文章

  • Spring Security整合CAS的示例代碼

    Spring Security整合CAS的示例代碼

    本篇文章主要介紹了Spring Security整合CAS的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 淺談從Java中的棧和堆,進而衍生到值傳遞

    淺談從Java中的棧和堆,進而衍生到值傳遞

    這篇文章主要介紹了淺談從Java中的棧和堆,進而衍生到值傳遞,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • springboot如何關(guān)掉tomcat容器

    springboot如何關(guān)掉tomcat容器

    這篇文章主要介紹了springboot如何關(guān)掉tomcat容器,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • SpringBoot Scheduling定時任務(wù)的示例代碼

    SpringBoot Scheduling定時任務(wù)的示例代碼

    springBoot提供了定時任務(wù)的支持,通過注解簡單快捷,對于日常定時任務(wù)可以使用。本文詳細(xì)的介紹一下使用,感興趣的可以了解一下
    2021-08-08
  • 淺談java運用注解實現(xiàn)對類中的方法檢測的工具

    淺談java運用注解實現(xiàn)對類中的方法檢測的工具

    這篇文章主要介紹了淺談java運用注解實現(xiàn)對類中的方法檢測的工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Spring實戰(zhàn)之讓Bean獲取Spring容器操作示例

    Spring實戰(zhàn)之讓Bean獲取Spring容器操作示例

    這篇文章主要介紹了Spring實戰(zhàn)之讓Bean獲取Spring容器操作,結(jié)合實例形式分析了Bean獲取Spring容器的相關(guān)原理、實現(xiàn)方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • 一文教你學(xué)會如何使用MyBatisPlus

    一文教你學(xué)會如何使用MyBatisPlus

    本篇文章,我們通過 MyBatis Plus 來對一張表進行 CRUD 操作,來看看是如何簡化我們開發(fā)的,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-05-05
  • 使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志

    使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志

    這篇文章主要為大家介紹了使用MDC快速查詢應(yīng)用接口全部執(zhí)行日志的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Json在Struts中的轉(zhuǎn)換與傳遞方法

    Json在Struts中的轉(zhuǎn)換與傳遞方法

    下面小編就為大家?guī)硪黄狫son在Struts中的轉(zhuǎn)換與傳遞方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Maven離線模式打包全過程

    Maven離線模式打包全過程

    這篇文章主要介紹了Maven離線模式打包全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

石门县| 伊吾县| 遂川县| 荆门市| 黎川县| 双城市| 布拖县| 万载县| 大同县| 南投市| 龙门县| 石家庄市| 石渠县| 安远县| 固原市| 烟台市| 石家庄市| 临沭县| 繁昌县| 邹平县| 紫金县| 南宁市| 安康市| 安塞县| 夹江县| 宜阳县| 阜阳市| 滕州市| 昌黎县| 寻甸| 泽普县| 牡丹江市| 东山县| 阳曲县| 芦山县| 铁岭市| 元朗区| 平安县| 虎林市| 嘉荫县| 醴陵市|