前端监控需要和消息队列对接,使用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版】是一款备受业界瞩目的网络安全工具,因其在国际上排名前十而彰显出其在安全扫描领域的卓越地位。这款扫描器的最新版本7.84,代表了开发者们对安全技术的持续追求与创新,旨在提供更高效、精准的...
在此次更新的 `curl 7.84.0` 版本中,针对 CentOS 和 Ubuntu 操作系统进行了优化,这意味着用户可以在这些平台上更加顺利地安装和使用 `curl`。 `curl 7.84.0` 的发布特别强调了安全漏洞的修复,这是任何软件升级中...
3. **ICMP扫描**:利用ICMP协议(Internet Control Message Protocol)的回显请求(ping)来检测主机的在线状态,同时也可以通过ICMP端口不可达消息来判断端口是否开放。 4. **隐身扫描**(Stealth Scanning):...
《curl-7.84.0-win64:在Windows 64位系统中的网络传输神器》 curl,一个强大的命令行工具,被广泛应用于数据的传输和下载,尤其在开发者社区中备受青睐。它的最新版本7.84.0针对Windows 64位平台进行了优化,为...
curl-7.84.0.tar.bz2
curl-7.84.0.tar.xz
SSS扫描器7.84版本
标题中的“7.84寸360-LCD-MIPI1280400,SSD2828驱动”是指一款7.84英寸的液晶显示器,该显示器采用了MIPI接口,分辨率为1280x400像素。其中,“7.84寸”指的是屏幕对角线的尺寸,通常用于描述显示屏的大小。这种尺寸...
window版curl工具
在win10用cmake3.22与vs2019编译好的curl库,版本号为7.84.0(当下最新版,支持SLL)。库文件已经整理成了lib、include的结构,其中还内置curl.exe. curl是一个利用URL语法在命令行下工作的文件传输工具,支持很多种...
SSS扫描器7.84版本是一款用于网络安全检测和漏洞扫描的专业工具,其主要功能是帮助用户发现网络系统中的安全漏洞和潜在风险。这个版本号(7.84)表明了该软件经过了一系列的更新和优化,以提供更好的性能和更全面的...
7.84寸MIPI接口IPS TFT-LCD模块 该TFT-LCD模块的主要特点是:7.84寸IPS显示屏,分辨率为1280 x 400像素,支持MIPI接口,亮度为550cd/m²,适用于各种电子产品。 一、总体规格 * 显示屏尺寸:7.84寸 * 分辨率:...
资本市场与企业融资(ppt 145)(7.84MB).ppt
【企业战略专题培训】是针对企业管理层的一次深入学习活动,旨在提升企业的长远规划和决策能力。培训由资深的高级咨询师、培训师、管理专家马超主讲,他拥有丰富的实战经验和理论知识,是中国TOP100金牌管理咨询师,...
在介绍JLink JFlash烧写指南之前,首先需要了解JLink和JFlash两个软件的用途和关系。JLink是Segger公司推出的一款USB接口的调试器,广泛应用于嵌入式系统和微控制器的开发和调试中。它可以用于多种微控制器和处理器...
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 ...
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....
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"是一个针对Windows平台的压缩包,其中包含的...