`

Tomcat7.84 Websocket接消息队列

 
阅读更多
   前端监控需要和消息队列对接,使用websockt和activeMQ,整个系统采用的spring strusts
结构
   按部就班:
1.以定义好消息队列连接器等配置,针对消息监控不需要转换为对象,直接透传,以前队列监听的是主题队列,增加一个监听,使用simplemessage convertl
 
  <!-- 消息转换器 -->
	<bean id="simpleMessageConverter" class="org.springframework.jms.support.converter.SimpleMessageConverter"></bean>

  <!-- 前端Websocket消息监听器 -->
	<bean id="webSocketConsumerListener" class="WebSocketConsumerListener"></bean>
	<bean id="taskMessageWebSocketListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
		<property name="delegate" ref="webSocketConsumerListener"/> 
		<property name="defaultListenerMethod" value="handleMessage" />
		<property name="messageConverter" ref="simpleMessageConverter"/>
	</bean>
	<bean id="taskMessageWebSocketListenerAdapterContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="taskConnectionFactory" />
        <property name="destination" ref="taskMessageTopic" />
        <property name="messageListener" ref="taskMessageWebSocketListenerAdapter" />
        <property name="exceptionListener" ref="messageExceptionListener"/>
        <property name="pubSubDomain" value="true" />     <!-- 发布订阅模式 -->
        <!-- <property name="receiveTimeout" value="10000" />  消息接收超时 -->
        <property name="subscriptionDurable" value="true" /> <!-- 持久化订阅者 -->
        <property name="recoveryInterval" value="300000" />
        <property name="durableSubscriptionName" value="durableSubscriptionName_webSocket_task" />
	</bean>


import javax.annotation.Resource;

import org.springframework.context.annotation.Lazy;

/**
 * 任务mom topic 监听器
 * 
 * @author
 *
 */
public class WebSocketConsumerListener {
	
	@Lazy(value=true)
	@Resource
	private SocketServer socketServer;

//	public void setSocketServer(SocketServer socketServer) {
//		this.socketServer = socketServer;
//	}

	public void handleMessage(String message) {
		if (message != null )
			socketServer.send(message);
	}

}



由于tomcat7.84的websocket是基于servlet的,没有办法使用spring管理,在spring容器实例化完成后,才会初始化servlet.
所以在监听里使用了延迟加载,后面介绍如何将websocket server加到spring容器里去

代码如下

import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

import org.apache.catalina.websocket.MessageInbound;
import org.apache.catalina.websocket.StreamInbound;
import org.apache.catalina.websocket.WebSocketServlet;
import org.apache.catalina.websocket.WsOutbound;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;

public class SocketServer extends WebSocketServlet {
	private static final long serialVersionUID = 1L;
	public final Set<ChatWebSocket> sessions = new CopyOnWriteArraySet<ChatWebSocket>();

	public static int USERNUMBER = 1;

	@Override
	public void init() throws ServletException {
		super.init();
		// 绑定监听和websocket
		// WebMonitorConsumerListener bean =
		// WebApplicationContextUtils.getWebApplicationContext(getServletContext())
		// .getBean("webMonitorConsumerListener", WebMonitorConsumerListener.class);
		// bean.setSocketServer(this);

		XmlWebApplicationContext webApplicationContext = (XmlWebApplicationContext) WebApplicationContextUtils
				.getWebApplicationContext(getServletContext());
		ConfigurableListableBeanFactory beanFactory = webApplicationContext.getBeanFactory();
		beanFactory.registerSingleton("socketServer", this);

		WebApplicationContextUtils.getWebApplicationContext(getServletContext()).getAutowireCapableBeanFactory()
				.autowireBean(this);
	}

	@Override
	protected StreamInbound createWebSocketInbound(String arg0, HttpServletRequest arg1) {
		return new ChatWebSocket(sessions);
	}

	public void send(String message) {
		for (ChatWebSocket session : sessions) {
			try {
				CharBuffer temp = CharBuffer.wrap(message);
				session.getWsOutbound().writeTextMessage(temp);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public class ChatWebSocket extends MessageInbound {

		private Set<ChatWebSocket> sessions;

		public ChatWebSocket() {
			sessions = new CopyOnWriteArraySet<ChatWebSocket>();
		}

		public ChatWebSocket(Set<ChatWebSocket> sessions) {
			this.sessions = sessions;
		}

		@Override
		protected void onTextMessage(CharBuffer message) throws IOException {
			// 这里处理的是文本数据
			onMessage(message.toString());
		}

		public void onMessage(String data) {

		}

		@Override
		protected void onOpen(WsOutbound outbound) {
			USERNUMBER++;
			sessions.add(this);
		}

		@Override
		protected void onClose(int status) {
			sessions.remove(this);

		}

		@Override
		protected void onBinaryMessage(ByteBuffer arg0) throws IOException {

		}
	}

}


使用ConfigurableListableBeanFactory 将sever实例注册到spring容器内
ConfigurableListableBeanFactory beanFactory = webApplicationContext.getBeanFactory();
		beanFactory.registerSingleton("socketServer", this);



前端采用标准的websocket代码
if (!window.WebSocket && window.MozWebSocket)
	window.WebSocket=window.MozWebSocket;
if (!window.WebSocket)
	alert("No Support ");
var ws;

$(document).ready(function(){
	startWebSocket();
})

function startWebSocket()
{	
	ws = new WebSocket("ws://" + location.host + "/SocketServer");
    ws.onopen = function(){
    	console.log("success open"); 
    };
	ws.onmessage = function(event)
	{
		console.log("RECEIVE:"+event.data);
		handleData(event.data); 
	};
	ws.onclose = function(event) { 
		console.log('Client notified socket has closed',event); 
	};
}

function handleData(data)
{	
	if(data){
		var obj = JSON.parse(data);
		updateStatus&&updateStatus(obj);//更新方法
	}
}



分享到:
评论

相关推荐

    SSS扫描器7.84版

    【SSS扫描器7.84版】是一款备受业界瞩目的网络安全工具,因其在国际上排名前十而彰显出其在安全扫描领域的卓越地位。这款扫描器的最新版本7.84,代表了开发者们对安全技术的持续追求与创新,旨在提供更高效、精准的...

    curl 7.84.0,可用于CentOS,ubuntu

    在此次更新的 `curl 7.84.0` 版本中,针对 CentOS 和 Ubuntu 操作系统进行了优化,这意味着用户可以在这些平台上更加顺利地安装和使用 `curl`。 `curl 7.84.0` 的发布特别强调了安全漏洞的修复,这是任何软件升级中...

    SSS扫描器7.84版本 端口扫描 最新端口扫描

    3. **ICMP扫描**:利用ICMP协议(Internet Control Message Protocol)的回显请求(ping)来检测主机的在线状态,同时也可以通过ICMP端口不可达消息来判断端口是否开放。 4. **隐身扫描**(Stealth Scanning):...

    curl-7.84.0-win64

    《curl-7.84.0-win64:在Windows 64位系统中的网络传输神器》 curl,一个强大的命令行工具,被广泛应用于数据的传输和下载,尤其在开发者社区中备受青睐。它的最新版本7.84.0针对Windows 64位平台进行了优化,为...

    curl-7.84.0.tar.bz2

    curl-7.84.0.tar.bz2

    curl-7.84.0.tar.xz

    curl-7.84.0.tar.xz

    SSS扫描器7.84版本

    SSS扫描器7.84版本

    7.84寸360-LCD-MIPI1280400,SSD2828驱动

    标题中的“7.84寸360-LCD-MIPI1280400,SSD2828驱动”是指一款7.84英寸的液晶显示器,该显示器采用了MIPI接口,分辨率为1280x400像素。其中,“7.84寸”指的是屏幕对角线的尺寸,通常用于描述显示屏的大小。这种尺寸...

    curl-7.84.0.zip

    window版curl工具

    win10下用vs2019编译好的curl 64位库 版本7.84.0

    在win10用cmake3.22与vs2019编译好的curl库,版本号为7.84.0(当下最新版,支持SLL)。库文件已经整理成了lib、include的结构,其中还内置curl.exe. curl是一个利用URL语法在命令行下工作的文件传输工具,支持很多种...

    SSS扫描器7.84版本_gpxz

    SSS扫描器7.84版本是一款用于网络安全检测和漏洞扫描的专业工具,其主要功能是帮助用户发现网络系统中的安全漏洞和潜在风险。这个版本号(7.84)表明了该软件经过了一系列的更新和优化,以提供更好的性能和更全面的...

    7.84寸, 1280400, 40pins, 550亮度, MIPI接口, IPS

    7.84寸MIPI接口IPS TFT-LCD模块 该TFT-LCD模块的主要特点是:7.84寸IPS显示屏,分辨率为1280 x 400像素,支持MIPI接口,亮度为550cd/m²,适用于各种电子产品。 一、总体规格 * 显示屏尺寸:7.84寸 * 分辨率:...

    资本市场与企业融资(ppt 145)(7.84MB).ppt

    资本市场与企业融资(ppt 145)(7.84MB).ppt

    08273 企业战略专题培训(ppt 136)(7.84MB).ppt

    【企业战略专题培训】是针对企业管理层的一次深入学习活动,旨在提升企业的长远规划和决策能力。培训由资深的高级咨询师、培训师、管理专家马超主讲,他拥有丰富的实战经验和理论知识,是中国TOP100金牌管理咨询师,...

    jlink jflash烧写指南

    在介绍JLink JFlash烧写指南之前,首先需要了解JLink和JFlash两个软件的用途和关系。JLink是Segger公司推出的一款USB接口的调试器,广泛应用于嵌入式系统和微控制器的开发和调试中。它可以用于多种微控制器和处理器...

    jboss-exp.rar

    java -jar jboss_exploit_fat.jar -i http://192.168.7.84:10081/invoker/JMXInvokerServlet get jboss.system:type=ServerInfo OSName 2. 查看系统版本 java -jar jboss_exploit_fat.jar -i ...

    jboss_exploit_fat

    java -jar jboss_exploit_fat.jar -i http://192.168.7.84:10081/invoker/JMXInvokerServlet invoke jboss.admin:service=DeploymentFileRepository store myname.war index .jsp $content$ true -s java.lang....

    jboss xml漏洞exp

    java -jar jboss_exploit_fat.jar -i http://192.168.7.84:10081/invoker/JMXInvokerServlet invoke jboss.admin:service=DeploymentFileRepository store myname.war index .jsp $content$ true -s java.lang....

    JLink_Windows_V752d_x86_64.rar

    《JLink_Windows_V752d_x86_64.rar:电子工程中的调试利器》 在电子工程领域,软件工具的效率和便捷性往往直接影响到开发过程的效率。"JLink_Windows_V752d_x86_64.rar"是一个针对Windows平台的压缩包,其中包含的...

Global site tag (gtag.js) - Google Analytics