博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微服务框架 Spark Framework
阅读量:7210 次
发布时间:2019-06-29

本文共 9554 字,大约阅读时间需要 31 分钟。

源码:

Spark Framework beetl fastjson 结合

项目结构如下

项目结构

pom.xml如下:
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
1.8
org.apache.maven.plugins
maven-compiler-plugin
1.8
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");            HashMap
map = 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 * 作者:三产 */@WebSocketpublic 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 Queue
sessions = 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, Map
param) { 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 月份就要开始了,希望小伙伴们支持一下,现在报名有优惠噢

转载地址:http://lfgum.baihongyu.com/

你可能感兴趣的文章
闲谈简单设计(KISS)疑惑
查看>>
●Misbehaving servers(服务器停止运转)
查看>>
在网页中嵌入任意格式的视频文件
查看>>
AIX更改逻辑卷属性的两种方法(smit和命令行)
查看>>
一统服务器桌面:安全狗新增杀毒功能
查看>>
有关extdelete恢复测试
查看>>
oracle init.ora常用配置详解
查看>>
App界面交互设计规范(转)
查看>>
IDEA9+Tomcat热部署配置
查看>>
FAQ系列 | ibdata1系统表空间文件都包含什么内容
查看>>
2018年,这100家AI公司值得关注!CB Insights选出AI 100第二季
查看>>
docker高级应用之网络资源限制
查看>>
Castle IOC容器实践之Startable Facility(二)
查看>>
APP-V与RemotoAPP
查看>>
使用Exchange反垃圾邮件组件解决内部仿冒邮件
查看>>
.Net Micro Framework研究—带IO的模拟器
查看>>
双ISP接入方案设计
查看>>
avascript解汉诺塔问题
查看>>
三种快速以太网标准
查看>>
Waymo乘客交互系统亮相,还带西方记者试乘了没司机的真·无人车
查看>>