摘要:我是廣告本人的直播課程在月份就要開始了,希望小伙伴們支持一下,現(xiàn)在報名有優(yōu)惠噢
Spark Framework beetl fastjson 結(jié)合
4.0.0 com.coderknock TestSpark 1.0-SNAPSHOT 1.2.17 1.7.21 com.ibeetl beetl 2.4.0 com.sparkjava spark-core 2.5 redis.clients jedis 2.8.1 com.alibaba fastjson 1.2.12 org.slf4j slf4j-log4j12 ${slf4j_version} org.jodd jodd-http 3.7.1 org.apache.maven.plugins maven-compiler-plugin 2.5.1 1.8 org.apache.maven.plugins maven-compiler-plugin 1.8 UTF-8 org.apache.maven.plugins maven-war-plugin 2.1.1 test org.apache.maven.plugins maven-dependency-plugin install install sources
WebSocket推送,普通Get請求以及返回Json的請求、使用Beetl進行視圖解析的方法:
/** * 拿客 www.coderknock.com * 微信公眾號 coderknock * 作者:三產(chǎn) */ import com.alibaba.fastjson.JSON; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import static spark.Spark.*; public class Test { private static Logger logger = LoggerFactory.getLogger(Test.class); public static void main(String[] args) { //設置端口 port(9090); //EchoWebSocket不能是內(nèi)部類 webSocket("/echo", EchoWebSocket.class); //這個必須有,不然注冊不成功 init(); // matches "GET /hello/foo" and "GET /hello/bar" // request.params(":name") is "foo" or "bar" get("/hello/:name", (request, response) -> { //使用Beetl進行視圖的解析 return Tmpl.render("hello.html", request.params()); }); // matches "GET /say/hello/to/world" // request.splat()[0] is "hello" and request.splat()[1] "world" get("/say/*/to/*", (request, response) -> { response.type("application/json"); HashMapmap = new HashMap (); map.put("1", request.splat()[0]); map.put("2", request.splat()[1]); //打印結(jié)果 logger.debug("$$$$$$$$$$$$$$$$$" + JSON.toJSON(map).toString()); return JSON.toJSON(map); }); get("/home", (request, response) -> { return Tmpl.render("index.html"); }); int i = 0; //WebSocket主動推送的實現(xiàn),啟動輪詢,定時發(fā)送消息 while (true) { try { Thread.currentThread().sleep(1000); i++; logger.debug("--->" + i); if (i % 5 == 1) { EchoWebSocket.send(i); logger.debug("--->第" + i + "次發(fā)送"); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
WebSocket實現(xiàn)類
import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; /** * 拿客 www.coderknock.com * 微信公眾號 coderknock * 作者:三產(chǎn) */ @WebSocket public class EchoWebSocket { private static Logger logger = LoggerFactory.getLogger(EchoWebSocket.class); // Store sessions if you want to, for example, broadcast a message to all users private static final Queuesessions = new ConcurrentLinkedQueue<>(); @OnWebSocketConnect public void connected(Session session) { sessions.add(session); //建立連接的時候 logger.debug("新增了Session" + session.toString()); } @OnWebSocketClose public void closed(Session session, int statusCode, String reason) { sessions.remove(session); //關(guān)閉連接或者瀏覽器關(guān)閉時 logger.debug("刪除了Session" + session.toString()); } @OnWebSocketMessage public void message(Session session, String message) throws IOException { //獲取到客戶端發(fā)送的消息時,對消息進行輸出,病簡單處理返回另一個消息 System.out.println("Got: " + message); // Print message session.getRemote().sendString(message + "1231"); // and send it back } public static void send(int i) { //這里只是簡單的給所有用戶推送,其實可以改造一下(將Session與用戶id之類的通過發(fā)送消息的方式一一對應,這樣可以為特定用戶進行消息的發(fā)送) sessions.forEach(session -> { try { session.getRemote().sendString("第" + i + "次主動推送"); } catch (Exception e) { logger.error("主動推送失敗", e); } } ); } }
Beetl的一個簡單封裝:
import org.beetl.core.Configuration; import org.beetl.core.GroupTemplate; import org.beetl.core.Template; import org.beetl.core.resource.WebAppResourceLoader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; /** * 拿客 www.coderknock.com * 微信公眾號 coderknock * 作者:三產(chǎn) */ public class Tmpl { private static GroupTemplate gt; private static Logger logger = LoggerFactory.getLogger(Tmpl.class); static { try { Configuration cfg = Configuration.defaultConfiguration(); WebAppResourceLoader resourceLoader = new WebAppResourceLoader(); gt = new GroupTemplate(resourceLoader, cfg); } catch (Exception e) { e.printStackTrace(); } } public static String render(String tmplPath) { Template t = gt.getTemplate(tmplPath); return t.render(); } public static String render(String tmplPath, Mapparam) { Template t = gt.getTemplate(tmplPath); Map convertMap = new HashMap<>(); try { param.forEach((x, y) -> { if (x.startsWith(":")) { convertMap.put(x.substring(1), y); } }); } catch (Exception e) { logger.error("轉(zhuǎn)換失敗", e); } t.binding(convertMap); return t.render(); } }
Get請求高并發(fā)測試:
/** * 拿客 www.coderknock.com * 微信公眾號 coderknock * 作者:三產(chǎn) */ import jodd.http.HttpRequest; import jodd.http.HttpResponse; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class TestGet { //大家可以適當加大,但是如果太大可能會導致get請求發(fā)送失敗,大家有優(yōu)化建議可以告訴我(客戶端問題,并不是Spark處理不了高并發(fā)) private static int thread_num = 500; private static int client_num = 500; public static void main(String[] args) { long time = System.currentTimeMillis(); ExecutorService exec = Executors.newCachedThreadPool(); final Semaphore semp = new Semaphore(thread_num); for (int index = 0; index < client_num; index++) { final int NO = index; Runnable run = new Runnable() { public void run() { try { semp.acquire(); System.out.println("------------------|" + NO + "|------------------"); HttpResponse response = HttpRequest .get("http://localhost:9090/say/Hello-" + NO + "/to/World" + NO ) .acceptEncoding("gzip") .send(); System.out.println(response.unzip()); System.out.println("------------------&" + NO + "&------------------"); //業(yè)務邏輯 semp.release(); } catch (Exception e) { e.printStackTrace(); } } }; exec.execute(run); } exec.shutdown(); } } WebSocket可以通過websocket.html測試(建議使用IE8以上瀏覽器): ![WebSocket測試](http://img.coderknock.com/201606/03214119104_02161833_kTuD.png "WebSocket測試") 先點擊“建立連接”,然后可以填寫一些內(nèi)容,點擊“發(fā)送數(shù)據(jù)”,連接建立后就開始了主動推送,我設置的是5秒鐘一次。我是廣告
本人的直播課程在 7 月份就要開始了,希望小伙伴們支持一下,現(xiàn)在報名有優(yōu)惠噢
https://segmentfault.com/l/15...
https://segmentfault.com/l/15...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67235.html
摘要:今天小數(shù)給大家?guī)硪黄夹g(shù)正能量滿滿的分享來自社區(qū)線上群分享的實錄,分享嘉賓是數(shù)人云肖德時。第二級調(diào)度由被稱作的組件組成。它們是最小的部署單元,由統(tǒng)一創(chuàng)建調(diào)度管理。 今天小數(shù)給大家?guī)硪黄夹g(shù)正能量滿滿的分享——來自KVM社區(qū)線上群分享的實錄,分享嘉賓是數(shù)人云CTO肖德時。 嘉賓介紹: 肖德時,數(shù)人云CTO 十五年計算機行業(yè)從業(yè)經(jīng)驗,曾為紅帽 Engineering Service ...
摘要:雖然廣受歡迎,但是仍受到來自另外一個基于的機器學習庫的競爭年出現(xiàn)的。還提供更傳統(tǒng)的機器學習功能的庫,包括神經(jīng)網(wǎng)絡和決策樹系統(tǒng)。和的機器學習庫。顧名思義,是用于神經(jīng)網(wǎng)絡機器學習的庫,便于將瀏覽器用作數(shù)據(jù)工作臺。 關(guān)于機器學習的11個開源工具 翻譯:瘋狂的技術(shù)宅英文標題:11 open source tools to make the most of machine learning英文連...
摘要:是一個集群管理器,提供了有效的跨分布式應用或框架的資源隔離和共享,可以運行。更貼近于層,而在之上。所以有人稱其為,或者分布式操作系統(tǒng)。你在這里可以看到使用的列表和有什么關(guān)聯(lián)嗎是一個為分布式應用提供一致性服務的軟件,而是一個分布式應用。 showImg(https://segmentfault.com/img/bVrBZJ); 聽過不少人在討論 Mesos,然而并不是很明白 Mesos ...
摘要:是一個集群管理器,提供了有效的跨分布式應用或框架的資源隔離和共享,可以運行。更貼近于層,而在之上。所以有人稱其為,或者分布式操作系統(tǒng)。你在這里可以看到使用的列表和有什么關(guān)聯(lián)嗎是一個為分布式應用提供一致性服務的軟件,而是一個分布式應用。 showImg(https://segmentfault.com/img/bVrBZJ); 聽過不少人在討論 Mesos,然而并不是很明白 Mesos ...
閱讀 2600·2021-11-15 11:38
閱讀 2618·2021-11-04 16:13
閱讀 17981·2021-09-22 15:07
閱讀 1014·2019-08-30 15:55
閱讀 3261·2019-08-30 14:15
閱讀 1663·2019-08-29 13:59
閱讀 3207·2019-08-28 18:28
閱讀 1575·2019-08-23 18:29