glassfish安装教程_教程:在Glassfish中使用WebSocket推送浏览器更新

本文是一篇关于如何在Glassfish服务器上利用WebSocket进行浏览器实时更新的教程。作者通过创建StockSocket和StockServlet类,展示了如何利用Grizzly Websocket API实现实时股票价格更新,并使用HighCharts JavaScript库在浏览器端展示更新的图表。
摘要由CSDN通过智能技术生成

glassfish安装教程

在2月的《 JAX Magazine》的本教程中,Steve Millidge通过语言和流行的Java服务器的组合为我们提供了WebSocket品尝器。

WebSocket是HTML5中的新增功能,并提供了在Web服务器和Web浏览器之间建立全双工连接的功能。 这意味着我们第一次可以编写应用程序以直接从服务器将更新推送到浏览器,而不必使用复杂的黑客手段,例如长轮询,Comet或Flash等第三方插件。

在本教程中,我将演示通过Websockets将股票“更新”推送到浏览器,以纯粹使用Websockets固有的推送功能异步更新股价图。 我还将在本教程中使用GlassFish,因为它在最新的产品GlassFish 3.1.2.2中具有开箱即用的Websockets支持,因此可以立即构建和部署。 但是,没有立即启用WebSocket支持。 可以通过管理控制台启用WebSocket支持,但是最简单的方法是使用asadmin命令。

asadmin设置configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.websockets-support-enabled = true

为了简短起见,在本教程中,我们的应用程序将仅生成一个线程以创建对股票价格的随机更新。 但是,在实际的应用程序中,将我们的应用程序通过JMS或其他某种机制挂接到数据提要很简单。

边栏?

WebSocket的Java API已在JCP的JSR 356下标准化。 当前,应用服务器使用专有的api来解锁Websockets功能,并且这里的GlassFish api特定于GlassFish。 Tomcat和其他服务器具有不同的API。 如果您对建议的JEE7 Websockets API感兴趣,请转到JCP页面进行查看。

借助Grizzly库,GlassFish支持Websocket。 我们需要的Grizzly Websocket API的关键类如图1所示

图1:Grizzly Websocket API中的关键类
StockSocket类

从头开始,首先必须创建Grizzly WebSocket类的派生类。 此类将实现浏览器和GlassFish之间的协议。 稍后我们将为每个客户端浏览器创建此类的一个实例。 在我们的课程中,我们将实现Runnable,产生一个Thread并将更新发送到浏览器。 在这段代码中(如清单1所示),我们将利用Grizzly提供的DefaultWebSocket类。 这实现了无操作的WebSocket接口的所有方法,因此我们可以覆盖我们感兴趣的方法。

清单1
public class StockSocket extends DefaultWebSocket implements Runnable
{
        private Thread myThread;
        private boolean connected = false;
public StockSocket(ProtocolHandler protocolHandler, WebSocketListener... listeners) {
        super(protocolHandler, listeners);

在onConnect方法(当客户端浏览器连接到服务器时调用)中,我们需要创建一个新的Thread并将Websocket实例作为Runnable传递,如清单2所示

清单2:onConnect
@Override     public void onConnect() {         myThread = new Thread(this);        connected = true;
  myThread.start();         super.onConnect();     }

在run方法( 清单3 )中,我们将使用Stock的随机值来定期调用自定义sendUpdate方法。 我们的Stock类是一个简单的Serializable POJO DTO,具有三个属性,即名称,描述和价格。

清单3:运行

public void run() {
while(connected) {
           Stock stock = new Stock("C2B2","C2B2",Math.random() * 100.0);
           int sleepTime = (int)(500*Math.random() + 500);               Thread.currentThread().sleep(sleepTime);
sendUpdate(stock);
  }
}

在sendUpdate方法( 清单4 )中,我们使用Jackson库将Stock对象序列化为JSON字符串。 然后,我们通过调用Grizzly基类的send方法将其通过WebSockets发送到浏览器,该方法将JSON字符串写入浏览器。

清单4:sendUpdate
public void sendUpdate(Stock stock) {
        // CONVERT to JSON
        ObjectMapper mapper = new ObjectMapper();
        StringWriter writer = new StringWriter();
        try {
            mapper.writeValue(writer, stock);
        } catch (IOException ex) {
        }
        String jsonStr = writer.toString();
        // SEND down the Websocket 
        send(jsonStr);
    }

最后,在我们的onClose方法( 清单5 )中,我们将连接设置为false来通知线程停止。

清单5:onClose
@Override
    public void onClose(DataFrame frame) {
        connected = false;
        super.onClose(frame);
    }
}

要将派生的StockSocket类连接到GlassFish服务器,我们需要创建派生的WebsocketApplication类,如下所示;

公共类StockApplication扩展WebSocketApplication

{

在此类中,我们需要重写两种方法。 第一个是isApplicationRequest,当客户端浏览器通过Websocket协议连接到GlassFish时,GlassFish会调用它( 清单6 )。 我们的应用程序需要检查请求并决定是否要接受连接。 在这种情况下,我们将检查Websocket请求的上下文路径是否包含字符串“ / stocks”。 如果是这样,我们需要通过返回true来告诉GlassFish该请求是针对我们的。

清单6:isApplicationRequest
@Override
    public boolean isApplicationRequest(Request request)
    {
        if (request.requestURI().toString().endsWith("/stocks"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

第二种方法是createWebSocket( 清单7 )。 在这里,我们需要创建并返回上述StockSocket类的实例。 当客户端浏览器连接到我们的应用程序并且我们接受了请求时,GlassFish将调用createWebSocket方法。

清单7:createWebSocket
@Override
    public WebSocket createWebSocket(ProtocolHandler protocolHandler, WebSocketListener... listeners)
    {
        return new StockSocket(protocolHandler, listeners);
    }
StockServlet类

我们需要编写的最后一个类是一个简单的servlet。 该servlet仅存在以确保我们向Grizzly的WebSocketEngine注册派生的StockApplication类。

@WebServlet(name = "StockServlet", urlPatterns =

{

"/stocks"

}, loadOnStartup = 1)

public class StockServlet extends HttpServlet {

private StockApplication pushApp;

我们在servlet的init方法中执行此操作,并确保在部署时创建servlet,我们必须在上面所示的批注中指定在启动时创建实例。

@Override

公共无效init(ServletConfig config)抛出ServletException {

super.init(config);

pushApp = new StockApplication();

WebSocketEngine.getEngine()。register(pushApp);

}

我们还需要重写destroy方法,以确保在取消部署时从WebSocketEngine取消注册StockApplication。

@Override

公共无效destroy()

{

super.destroy();

WebSocketEngine.getEngine()。unregister(pushApp);

}

}

一旦编写了Java servlet和使用Grizzly的WebSocket API的类,我们就需要转向HTML和Javascript代码。 在我们的演示中,我们将使用一个名为Highcharts的Javascript库,该库可免费用于非商业用途。 此Javascript库可以完全通过使用HTML5来呈现非常性感的图表。

对于我们的浏览器,我们将创建一个简单的JSP页面,该页面使用Websocket Javascript API通过Websocket协议连接到GlassFish,然后接收我们的JSON股票更新,并将其馈送到HighCharts进行图形化。

WebSockets Javascript API中需要做的第一件事是使用Websocket协议连接到GlassFish服务器。 为此,我们需要创建ws:// <host>:<port> / <context>形式的URL,并将其传递给WebSocket类的构造函数。

<script type =“ text / javascript”>

var wsUri =“ ws://” + location.host +“ $ {pageContext.request.contextPath} / stocks”;

websocket =新的WebSocket(wsUri);

一旦有了Websocket对象,就必须设置回调函数。 当Websocket事件发生时,浏览器将调用这些Javascript函数,例如,当套接字打开(onOpen),关闭(onClose)或发生错误(onError)时。 为简单起见,我们将这些设置为空函数。

websocket.onopen = function(event){};

websocket.onclose = function(event){};

websocket.onerror = function(event){};

最重要的回调是onmessage。 当浏览器通过Websocket从服务器接收数据时,将触发此事件;在本例中,当我们接收到代表库存对象的JSON字符串时,将调用此方法。 因此,我们将解析JSON字符串并在HighCharts中为此股票价格更新创建一个新的数据点。

websocket.onmessage = function(event){

var object = JSON.parse(event.data);

var x =(new Date())。getTime();

var y = object.price;

document.chart.series [0] .addPoint([x,y],true,true,false);

}

</ script>

HighCharts图表的初始化在文档的开头完成,其摘要如下所示。

清单9:HighCharts

<script type="text/javascript">
$(document).ready(function() {
        Highcharts.setOptions({
                global: {
                        useUTC: false
                }
        });
        var chart;
        document.chart = new Highcharts.Chart({
       …
});
</script>

应该将JSP页面打包到war文件中,上面显示servlet和Java Grizzly代码,然后以通常的方式将其部署到GlassFish服务器。

最终视图

成功部署代码后,您可以使用通常的浏览器导航到该代码,并且应该会看到更新图表。

图2:更新图表

使用标准的WebSocket Javascript API和现代应用程序服务器(例如GlassFish)构建推送应用程序非常容易。 希望本教程能激发您的胃口,并激发您探索应用程序中的WebSockets的兴趣。

史蒂夫·米利奇(Steve Millidge)是C2B2 Consulting Limited的董事和创始人,从pre1.0开始,他就广泛使用Java,并且作为现场专业服务顾问已有10多年了。 现在,他通过C2B2致力于JEE和SOA基础结构的配置,以实现最大的可伸缩性,性能,可用性,可恢复性,可管理性和安全性。 在为Oracle,BEA和Red Hat专业服务并代表Oracle,BEA和Red Hat工作之前,他在部署大规模生产系统方面拥有丰富的经验。 史蒂夫(Steve)在许多活动中发表了演讲,包括Java One,Jax London,英国Oracle用户组会议,服务器SOA,云与服务技术研讨会,JBoss World。 他是伦敦JBoss用户组的主要组织者,并定期为C2B2的客户群介绍咖啡袋技术会议。

这篇文章首先出现在JAX Magazine上:Socket! 在2013年2月发行。请在此处下载该期刊和其他刊物。

图片由cote提供


翻译自: https://jaxenter.com/tutorial-pushing-browser-updates-using-websockets-in-glassfish-105970.html

glassfish安装教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值