欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring使用event-stream進(jìn)行數(shù)據(jù)推送

 更新時(shí)間:2024年03月25日 09:31:06   作者:zyydd_  
這篇文章主要介紹了Spring使用event-stream進(jìn)行數(shù)據(jù)推送,前端使用EventSource方式向后臺(tái)發(fā)送請(qǐng)求,后端接收到之后使用event-stream方式流式返回,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下

前端使用EventSource方式向后臺(tái)發(fā)送請(qǐng)求,后端接收到之后使用event-stream方式流式返回??梢詰?yīng)用在時(shí)鐘、逐字聊天等場(chǎng)景。

前端js示例代碼(向后臺(tái)請(qǐng)求數(shù)據(jù),并展示到“id=date”的div上)

<script type="text/javascript">
    if (typeof (EventSource) !== "undefined") {
        var eventSource = new EventSource("${root}/test/getDate");
        eventSource.onmessage = function (event) {
            document.getElementById("date").innerHTML = event.data;
        }
        eventSource.addEventListener('error', function (event) {
            console.log("錯(cuò)誤:" + event);
        });
        eventSource.addEventListener('open', function (event) {
            console.log("建立連接:" + event);
        });
    } else {
        document.getElementById("date").innerHTML = "抱歉,您的瀏覽器不支持EventSource事件 ...";
    }
</script>

后端java示例

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
 
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
 
@Controller
@RequestMapping(value = "/test")
public class TestController {
 
    @ResponseBody
    @RequestMapping(value = "/getDate", produces = "text/event-stream;charset=UTF-8")
    public void getDate(HttpServletResponse response) throws Exception {
        System.out.println("getDate event start");
        response.setContentType("text/event-stream");
        response.setCharacterEncoding("UTF-8");
        response.setStatus(200);
        for (int i = 0; i < 10; i++) {
            response.getWriter().write("data:" + new Date() + "\n\n");
            response.getWriter().flush();
            Thread.sleep(1000);
        }
        response.getWriter().close();
        System.out.println("getDate event end");
    }
 
}

除了是這個(gè)方法,我們也可以使用Spring的定時(shí)器定時(shí)推送數(shù)據(jù)

定時(shí)器編寫

1.在配置文件里添加相關(guān)配置

?
<!-- 定時(shí)器開關(guān) -->
<task:annotation-driven />
    
<!-- 自動(dòng)掃描的包名 -->
<bean id="myTaskXml" class="定時(shí)方法所在的類的完整類名"></bean>
<task:scheduled-tasks>
	<task:scheduled ref="myTaskXml" method="appInfoAdd" cron="*/5 * * * * ?"/>
</task:scheduled-tasks>
 
?

上面的代碼設(shè)置的是每5秒執(zhí)行一次appInfoAdd方法,cron字段表示的是時(shí)間的設(shè)置,分為:秒,分,時(shí),日,月,周,年。

2.定時(shí)方法的編寫

Logger log = Logger.getLogger(TimerTask.class);;
public void apiInfoAdd(){
    InputStream in = TimerTask.class.getClassLoader().getResourceAsStream("/system.properties");
    Properties prop = new Properties();
    try {
		prop.load(in);
	} catch (IOException e) {
		e.printStackTrace();
	}
    String key = prop.getProperty("DLKEY");
    log.info("key--" + key);
    //鎖數(shù)據(jù)操作
    List<GbEsealInfo> list = this.esealService.loadBySendFlag("0");   	
    if (list == null) {
    	log.info("沒(méi)有需要推送的鎖數(shù)據(jù)");
    }else{
    	JsonObject json = new JsonObject();
        JsonArray ja = new JsonArray();
        json.add("esealList", ja);
        for(int i = 0; i < list.size(); i++) {
        	GbEntInfo ent = this.entService.loadByPk(list.get(i).getEntId());
            JsonObject esealJson = getEsealJson(list.get(i), ent);        	
            ja.add(esealJson);	
        }
        String data = json.toString();
        log.info("鎖數(shù)據(jù)--" + data);
        HttpDeal hd = new HttpDeal();
        Map<String,String> map = new HashMap<String, String>();
        map.put("key",key);
        map.put("data", data);
        hd.post(prop.getProperty("ESEALURL"), map);
        log.info(hd.responseMsg);
        JsonObject returnData = new JsonParser().parse(hd.responseMsg).getAsJsonObject();
        if (("\"10000\"").equals(returnData.get("code").toString())){
          	log.info("鎖數(shù)據(jù)推送成功");
            for(int i = 0; i < list.size(); i++){
              	list.get(i).setSendFlag("1");
              	int res = this.esealService.updateSelectiveByPk(list.get(i));
              	if(res == 0){
              	    log.info("第" + (i+1) + "條鎖數(shù)據(jù)的sendflag字段的狀態(tài)值修改失敗");
              	    continue;
              	}
            }
        }
   }

這個(gè)過(guò)程包括讀取配置文件里的key,從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)(根據(jù)數(shù)據(jù)的字段判斷是否需要推送),使用GSON把數(shù)據(jù)拼裝成上一篇文章里的data的形式data={"esealList":[{},{},{}]},使用HttpClient執(zhí)行帶參數(shù)的POST方法,訪問(wèn)POST接口,根據(jù)返回信息判斷狀態(tài)。

3.HttpClient里的帶參POST方法

public class HttpDeal {
    public String responseMsg;
	
	public String post(String url,Map<String, String> params){
		//實(shí)例化httpClient
		CloseableHttpClient httpclient = HttpClients.createDefault();
		//實(shí)例化post方法
		HttpPost httpPost = new HttpPost(url); 
		//處理參數(shù)
		List<NameValuePair> nvps = new ArrayList <NameValuePair>();  
        Set<String> keySet = params.keySet();  
	    for(String key : keySet) {  
	        nvps.add(new BasicNameValuePair(key, params.get(key)));  
	    }  
		//結(jié)果
		CloseableHttpResponse response = null;
		String content="";
		try {
			//提交的參數(shù)
			UrlEncodedFormEntity uefEntity  = new UrlEncodedFormEntity(nvps, "UTF-8");
			//將參數(shù)給post方法
			httpPost.setEntity(uefEntity);
			//執(zhí)行post方法
			response = httpclient.execute(httpPost);
			if(response.getStatusLine().getStatusCode()==200){
				content = EntityUtils.toString(response.getEntity(),"utf-8");
				responseMsg = content;
				//System.out.println(content);
			}
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		return content;
	}
	public static void main(String[] args) {
		HttpDeal hd = new HttpDeal();
        Map<String,String> map = new HashMap();
        map.put("key","5c07db6e22c780e76824c88b2e65e9d9");
        map.put("data", "{'esealList':[{'esealId':'1','entName':'q','entName':企業(yè),'id':'qqww','id':'123', 'customsCode':'qq','fax':'021-39297127'}]}");
        hd.post("http://localhost:8080/EportGnssWebDL/api/CopInfoAPI/esealInfoAdd.json",map);
	}
}

4.輔助類

    /**
     * 輔助類:鎖接口需要的字段
     * @param eseal
     * @param ent
     * @return
     */
    private JsonObject getEsealJson(GbEsealInfo eseal, GbEntInfo ent){	
    	JsonObject j = new JsonObject(); 	
    	j.addProperty("esealId", eseal.getEsealId());
    	j.addProperty("vehicleNo", eseal.getVehicleNo());
    	j.addProperty("customsCode", eseal.getCustomsCode());
    	j.addProperty("simNo", eseal.getSimNo());
    	j.addProperty("entName", ent.getEntName());
    	j.addProperty("customsName", eseal.getCustomsName());
    	j.addProperty("leadingOfficial", ent.getLeadingOfficial());
    	j.addProperty("contact", ent.getContact());
    	j.addProperty("address", ent.getAddress());
    	j.addProperty("mail", ent.getMail());
    	j.addProperty("phone", ent.getPhone());
    	j.addProperty("fax", ent.getFax());
    	return j;
    }

以上就是Spring使用event-stream進(jìn)行數(shù)據(jù)推送的詳細(xì)內(nèi)容,更多關(guān)于Spring event-stream數(shù)據(jù)推送的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí)

    java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí)

    java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí),1000次插入方法的比較。
    2013-04-04
  • Maven的pom.xml中resources標(biāo)簽的用法

    Maven的pom.xml中resources標(biāo)簽的用法

    本文主要介紹了Maven的pom.xml中resources標(biāo)簽的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • springboot+dynamicDataSource動(dòng)態(tài)添加切換數(shù)據(jù)源方式

    springboot+dynamicDataSource動(dòng)態(tài)添加切換數(shù)據(jù)源方式

    這篇文章主要介紹了springboot+dynamicDataSource動(dòng)態(tài)添加切換數(shù)據(jù)源方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • springboot整合SSE的項(xiàng)目實(shí)踐

    springboot整合SSE的項(xiàng)目實(shí)踐

    SSE是一種可以主動(dòng)從服務(wù)端推送消息的技術(shù),本文主要介紹了springboot整合SSE的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Hibernate一級(jí)緩存和二級(jí)緩存詳解

    Hibernate一級(jí)緩存和二級(jí)緩存詳解

    今天小編就為大家分享一篇關(guān)于Hibernate一級(jí)緩存和二級(jí)緩存詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • idea解決程序包不存在報(bào)錯(cuò)的八種解決方法

    idea解決程序包不存在報(bào)錯(cuò)的八種解決方法

    這篇文章主要介紹了idea解決程序包不存在報(bào)錯(cuò)的八種解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • 實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開發(fā)中的運(yùn)用

    實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開發(fā)中的運(yùn)用

    觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己.下面就以實(shí)例解析觀察者模式及其在Java設(shè)計(jì)模式開發(fā)中的運(yùn)用
    2016-05-05
  • 使用Java手搓一個(gè)控制臺(tái)進(jìn)度條打印工具

    使用Java手搓一個(gè)控制臺(tái)進(jìn)度條打印工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Java手搓一個(gè)控制臺(tái)進(jìn)度條打印工具,文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • 八種Java中的基本數(shù)據(jù)類型詳解

    八種Java中的基本數(shù)據(jù)類型詳解

    在Java編程中,基本數(shù)據(jù)類型是必不可少的一部分,對(duì)于初學(xué)者而言,理解這些基本數(shù)據(jù)類型是非常重要的,下面我們就來(lái)學(xué)習(xí)一下Java中的八種基本數(shù)據(jù)類型,以及它們的使用方法吧
    2023-08-08
  • 新手了解java 異常處理基礎(chǔ)知識(shí)

    新手了解java 異常處理基礎(chǔ)知識(shí)

    Java中異常提供了一種識(shí)別及響應(yīng)錯(cuò)誤情況的一致性機(jī)制,有效地異常處理能使程序更加健壯、易于調(diào)試。那么這篇文章總結(jié)了Java有效處理異常的三個(gè)原則,有需要的朋友們可以參考借鑒
    2021-07-07

最新評(píng)論