摘要:我是广告本人的直播课程在月份就要开始了,希望小伙伴们支持一下,现在报名有优惠噢
Spark Framework beetl fastjson 结合
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 * 作者:三产 */ 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不能是内部类 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]); //打印结果 logger.debug("$$$$$$$$$$$$$$$$$" + JSON.toJSON(map).toString()); return JSON.toJSON(map); }); get("/home", (request, response) -> { return Tmpl.render("index.html"); }); int i = 0; //WebSocket主动推送的实现,启动轮询,定时发送消息 while (true) { try { Thread.currentThread().sleep(1000); i++; logger.debug("--->" + i); if (i % 5 == 1) { EchoWebSocket.send(i); logger.debug("--->第" + i + "次发送"); } } catch (InterruptedException e) { e.printStackTrace(); } } } }
WebSocket实现类
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 * 作者:三产 */ @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); //关闭连接或者浏览器关闭时 logger.debug("删除了Session" + session.toString()); } @OnWebSocketMessage public void message(Session session, String message) throws IOException { //获取到客户端发送的消息时,对消息进行输出,病简单处理返回另一个消息 System.out.println("Got: " + message); // Print message session.getRemote().sendString(message + "1231"); // and send it back } public static void send(int i) { //这里只是简单的给所有用户推送,其实可以改造一下(将Session与用户id之类的通过发送消息的方式一一对应,这样可以为特定用户进行消息的发送) 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 * 作者:三产 */ 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("转换失败", e); } t.binding(convertMap); return t.render(); } }
Get请求高并发测试:
/** * 拿客 www.coderknock.com * 微信公众号 coderknock * 作者:三产 */ 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请求发送失败,大家有优化建议可以告诉我(客户端问题,并不是Spark处理不了高并发) 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 + "&------------------"); //业务逻辑 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测试") 先点击“建立连接”,然后可以填写一些内容,点击“发送数据”,连接建立后就开始了主动推送,我设置的是5秒钟一次。我是广告
本人的直播课程在 7 月份就要开始了,希望小伙伴们支持一下,现在报名有优惠噢
https://segmentfault.com/l/15...
https://segmentfault.com/l/15...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/67235.html
摘要:今天小数给大家带来一篇技术正能量满满的分享来自社区线上群分享的实录,分享嘉宾是数人云肖德时。第二级调度由被称作的组件组成。它们是最小的部署单元,由统一创建调度管理。 今天小数给大家带来一篇技术正能量满满的分享——来自KVM社区线上群分享的实录,分享嘉宾是数人云CTO肖德时。 嘉宾介绍: 肖德时,数人云CTO 十五年计算机行业从业经验,曾为红帽 Engineering Service ...
摘要:虽然广受欢迎,但是仍受到来自另外一个基于的机器学习库的竞争年出现的。还提供更传统的机器学习功能的库,包括神经网络和决策树系统。和的机器学习库。顾名思义,是用于神经网络机器学习的库,便于将浏览器用作数据工作台。 关于机器学习的11个开源工具 翻译:疯狂的技术宅英文标题:11 open source tools to make the most of machine learning英文连...
摘要:是一个集群管理器,提供了有效的跨分布式应用或框架的资源隔离和共享,可以运行。更贴近于层,而在之上。所以有人称其为,或者分布式操作系统。你在这里可以看到使用的列表和有什么关联吗是一个为分布式应用提供一致性服务的软件,而是一个分布式应用。 showImg(https://segmentfault.com/img/bVrBZJ); 听过不少人在讨论 Mesos,然而并不是很明白 Mesos ...
摘要:是一个集群管理器,提供了有效的跨分布式应用或框架的资源隔离和共享,可以运行。更贴近于层,而在之上。所以有人称其为,或者分布式操作系统。你在这里可以看到使用的列表和有什么关联吗是一个为分布式应用提供一致性服务的软件,而是一个分布式应用。 showImg(https://segmentfault.com/img/bVrBZJ); 听过不少人在讨论 Mesos,然而并不是很明白 Mesos ...
阅读 2599·2021-11-15 11:38
阅读 2618·2021-11-04 16:13
阅读 17978·2021-09-22 15:07
阅读 1013·2019-08-30 15:55
阅读 3260·2019-08-30 14:15
阅读 1663·2019-08-29 13:59
阅读 3206·2019-08-28 18:28
阅读 1575·2019-08-23 18:29