Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
D
dataease
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
njgzx
dataease
Commits
0c16ca38
提交
0c16ca38
authored
4月 13, 2022
作者:
fit2cloud-chenyw
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 集群环境websocket消息
上级
d7521f88
显示空白字符变更
内嵌
并排
正在显示
18 个修改的文件
包含
355 行增加
和
36 行删除
+355
-36
RedisConstants.java
...in/java/io/dataease/commons/constants/RedisConstants.java
+12
-0
RedisMessage.java
...src/main/java/io/dataease/commons/model/RedisMessage.java
+13
-0
RedisConfig.java
backend/src/main/java/io/dataease/config/RedisConfig.java
+14
-2
RedisMessageSubscriber.java
...ain/java/io/dataease/listener/RedisMessageSubscriber.java
+59
-0
RedisMessageBroadcast.java
...java/io/dataease/service/redis/RedisMessageBroadcast.java
+6
-0
PluginMsgService.java
...java/io/dataease/service/redis/impl/PluginMsgService.java
+13
-0
WsMsgService.java
...ain/java/io/dataease/service/redis/impl/WsMsgService.java
+29
-0
WsConfig.java
.../src/main/java/io/dataease/websocket/config/WsConfig.java
+7
-1
DePrincipal.java
...c/main/java/io/dataease/websocket/entity/DePrincipal.java
+17
-0
DeWebSocketHandlerDecorator.java
...taease/websocket/factory/DeWebSocketHandlerDecorator.java
+33
-0
DeWsHandlerFactory.java
...ava/io/dataease/websocket/factory/DeWsHandlerFactory.java
+15
-0
PrincipalHandshakeHandler.java
...dataease/websocket/handler/PrincipalHandshakeHandler.java
+30
-0
WsService.java
...rc/main/java/io/dataease/websocket/service/WsService.java
+2
-30
DistributedWsService.java
...dataease/websocket/service/impl/DistributedWsService.java
+34
-0
StandaloneWsService.java
.../dataease/websocket/service/impl/StandaloneWsService.java
+21
-0
WsUtil.java
backend/src/main/java/io/dataease/websocket/util/WsUtil.java
+46
-0
index.vue
frontend/src/components/Notification/index.vue
+1
-1
index.js
frontend/src/websocket/index.js
+3
-2
没有找到文件。
backend/src/main/java/io/dataease/commons/constants/RedisConstants.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
commons
.
constants
;
public
class
RedisConstants
{
public
static
final
String
GLOBAL_REDIS_TOPIC
=
"global_redis_topic"
;
public
static
final
String
PLUGIN_INSTALL_MSG
=
"pluginMsgService"
;
public
static
final
String
WEBSOCKET_MSG
=
"wsMsgService"
;
}
backend/src/main/java/io/dataease/commons/model/RedisMessage.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
commons
.
model
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
public
class
RedisMessage
<
T
>
implements
Serializable
{
private
String
type
;
private
T
data
;
}
backend/src/main/java/io/dataease/config/RedisConfig.java
浏览文件 @
0c16ca38
...
@@ -2,19 +2,24 @@ package io.dataease.config;
...
@@ -2,19 +2,24 @@ package io.dataease.config;
import
io.dataease.commons.condition.RedisStatusCondition
;
import
io.dataease.commons.condition.RedisStatusCondition
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.data.redis.connection.RedisConnectionFactory
;
import
org.springframework.data.redis.connection.RedisConnectionFactory
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.listener.RedisMessageListenerContainer
;
import
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
;
import
org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
;
@Conditional
({
RedisStatusCondition
.
class
})
@Configuration
@Configuration
public
class
RedisConfig
{
public
class
RedisConfig
{
@Conditional
({
RedisStatusCondition
.
class
})
@Autowired
private
RedisConnectionFactory
redisConnectionFactory
;
@Bean
@Bean
public
RedisTemplate
<
Object
,
Object
>
redisTemplate
(
RedisConnectionFactory
factory
)
{
public
RedisTemplate
<
Object
,
Object
>
redisTemplate
(
RedisConnectionFactory
factory
)
{
RedisTemplate
<
Object
,
Object
>
redisTemplate
=
new
RedisTemplate
<>();
RedisTemplate
<
Object
,
Object
>
redisTemplate
=
new
RedisTemplate
<>();
...
@@ -24,4 +29,11 @@ public class RedisConfig {
...
@@ -24,4 +29,11 @@ public class RedisConfig {
return
redisTemplate
;
return
redisTemplate
;
}
}
@Bean
public
RedisMessageListenerContainer
redisContainer
()
{
final
RedisMessageListenerContainer
container
=
new
RedisMessageListenerContainer
();
container
.
setConnectionFactory
(
redisConnectionFactory
);
return
container
;
}
}
}
backend/src/main/java/io/dataease/listener/RedisMessageSubscriber.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
listener
;
import
com.google.gson.Gson
;
import
io.dataease.commons.condition.RedisStatusCondition
;
import
io.dataease.commons.constants.RedisConstants
;
import
io.dataease.commons.model.RedisMessage
;
import
io.dataease.commons.utils.CommonBeanFactory
;
import
io.dataease.commons.utils.LogUtil
;
import
io.dataease.service.redis.RedisMessageBroadcast
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.context.event.ApplicationReadyEvent
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.event.EventListener
;
import
org.springframework.data.redis.connection.Message
;
import
org.springframework.data.redis.connection.MessageListener
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.listener.ChannelTopic
;
import
org.springframework.data.redis.listener.RedisMessageListenerContainer
;
import
org.springframework.data.redis.listener.adapter.MessageListenerAdapter
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
@Conditional
({
RedisStatusCondition
.
class
})
@Service
public
class
RedisMessageSubscriber
implements
MessageListener
{
@Resource
private
RedisMessageListenerContainer
redisMessageListenerContainer
;
private
static
final
Gson
json
=
new
Gson
();
@Autowired
private
RedisTemplate
redisTemplate
;
/**
* 启动之后订阅 topic
*/
@EventListener
public
void
init
(
ApplicationReadyEvent
event
)
{
String
topic
=
RedisConstants
.
GLOBAL_REDIS_TOPIC
;
LogUtil
.
info
(
"Subscribe Topic: "
+
topic
);
redisMessageListenerContainer
.
addMessageListener
(
new
MessageListenerAdapter
(
this
),
new
ChannelTopic
(
topic
));
}
/**
* @param message 消息内容
* @param pattern 暂时用不到
*/
public
void
onMessage
(
final
Message
message
,
final
byte
[]
pattern
)
{
RedisMessage
redisMessage
=
json
.
fromJson
(
message
.
toString
(),
RedisMessage
.
class
);
RedisMessageBroadcast
service
=
(
RedisMessageBroadcast
)
CommonBeanFactory
.
getBean
(
redisMessage
.
getType
());
service
.
messageCallBack
(
redisMessage
.
getData
());
}
}
backend/src/main/java/io/dataease/service/redis/RedisMessageBroadcast.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
service
.
redis
;
public
interface
RedisMessageBroadcast
<
T
>
{
void
messageCallBack
(
T
arg
);
}
backend/src/main/java/io/dataease/service/redis/impl/PluginMsgService.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
service
.
redis
.
impl
;
import
io.dataease.service.redis.RedisMessageBroadcast
;
import
org.springframework.stereotype.Service
;
@Service
public
class
PluginMsgService
implements
RedisMessageBroadcast
{
@Override
public
void
messageCallBack
(
Object
arg
)
{
}
}
backend/src/main/java/io/dataease/service/redis/impl/WsMsgService.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
service
.
redis
.
impl
;
import
com.google.gson.Gson
;
import
io.dataease.service.redis.RedisMessageBroadcast
;
import
io.dataease.websocket.entity.WsMessage
;
import
io.dataease.websocket.service.impl.StandaloneWsService
;
import
io.dataease.websocket.util.WsUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.Map
;
@Service
public
class
WsMsgService
implements
RedisMessageBroadcast
<
Map
>
{
private
static
Gson
json
=
new
Gson
();
@Autowired
private
StandaloneWsService
standaloneWsService
;
@Override
public
void
messageCallBack
(
Map
arg
)
{
WsMessage
message
=
json
.
fromJson
(
json
.
toJson
(
arg
),
WsMessage
.
class
);
Long
userId
=
message
.
getUserId
();
if
(
WsUtil
.
isOnLine
(
userId
))
{
standaloneWsService
.
releaseMessage
(
message
);
}
}
}
backend/src/main/java/io/dataease/websocket/config/WsConfig.java
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
config
;
package
io
.
dataease
.
websocket
.
config
;
import
io.dataease.websocket.factory.DeWsHandlerFactory
;
import
io.dataease.websocket.handler.PrincipalHandshakeHandler
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.messaging.simp.config.MessageBrokerRegistry
;
import
org.springframework.messaging.simp.config.MessageBrokerRegistry
;
import
org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker
;
import
org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker
;
...
@@ -15,7 +17,10 @@ public class WsConfig implements WebSocketMessageBrokerConfigurer {
...
@@ -15,7 +17,10 @@ public class WsConfig implements WebSocketMessageBrokerConfigurer {
@Override
@Override
public
void
registerStompEndpoints
(
StompEndpointRegistry
registry
)
{
public
void
registerStompEndpoints
(
StompEndpointRegistry
registry
)
{
registry
.
addEndpoint
(
"/websocket"
).
setAllowedOriginPatterns
(
"*"
).
withSockJS
();
registry
.
addEndpoint
(
"/websocket"
)
.
setAllowedOriginPatterns
(
"*"
)
.
setHandshakeHandler
(
new
PrincipalHandshakeHandler
())
.
withSockJS
();
}
}
@Override
@Override
...
@@ -26,6 +31,7 @@ public class WsConfig implements WebSocketMessageBrokerConfigurer {
...
@@ -26,6 +31,7 @@ public class WsConfig implements WebSocketMessageBrokerConfigurer {
@Override
@Override
public
void
configureWebSocketTransport
(
WebSocketTransportRegistration
registry
)
{
public
void
configureWebSocketTransport
(
WebSocketTransportRegistration
registry
)
{
registry
.
addDecoratorFactory
(
new
DeWsHandlerFactory
());
registry
.
setMessageSizeLimit
(
8192
)
//设置消息字节数大小
registry
.
setMessageSizeLimit
(
8192
)
//设置消息字节数大小
.
setSendBufferSizeLimit
(
8192
)
//设置消息缓存大小
.
setSendBufferSizeLimit
(
8192
)
//设置消息缓存大小
.
setSendTimeLimit
(
10000
);
//设置消息发送时间限制毫秒
.
setSendTimeLimit
(
10000
);
//设置消息发送时间限制毫秒
...
...
backend/src/main/java/io/dataease/websocket/entity/DePrincipal.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
entity
;
import
java.security.Principal
;
public
class
DePrincipal
implements
Principal
{
public
DePrincipal
(
String
name
)
{
this
.
name
=
name
;
}
private
String
name
;
@Override
public
String
getName
()
{
return
name
;
}
}
backend/src/main/java/io/dataease/websocket/factory/DeWebSocketHandlerDecorator.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
factory
;
import
io.dataease.websocket.util.WsUtil
;
import
org.springframework.web.socket.CloseStatus
;
import
org.springframework.web.socket.WebSocketHandler
;
import
org.springframework.web.socket.WebSocketSession
;
import
org.springframework.web.socket.handler.WebSocketHandlerDecorator
;
public
class
DeWebSocketHandlerDecorator
extends
WebSocketHandlerDecorator
{
public
DeWebSocketHandlerDecorator
(
WebSocketHandler
delegate
)
{
super
(
delegate
);
}
@Override
public
void
afterConnectionEstablished
(
WebSocketSession
session
)
throws
Exception
{
String
name
=
session
.
getPrincipal
().
getName
();
Long
userId
=
Long
.
parseLong
(
name
);
WsUtil
.
onLine
(
userId
);
super
.
afterConnectionEstablished
(
session
);
}
@Override
public
void
afterConnectionClosed
(
WebSocketSession
session
,
CloseStatus
closeStatus
)
throws
Exception
{
String
name
=
session
.
getPrincipal
().
getName
();
Long
userId
=
Long
.
parseLong
(
name
);
WsUtil
.
offLine
(
userId
);
super
.
afterConnectionClosed
(
session
,
closeStatus
);
}
}
backend/src/main/java/io/dataease/websocket/factory/DeWsHandlerFactory.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
factory
;
import
org.springframework.web.socket.WebSocketHandler
;
import
org.springframework.web.socket.handler.WebSocketHandlerDecorator
;
import
org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory
;
public
class
DeWsHandlerFactory
implements
WebSocketHandlerDecoratorFactory
{
@Override
public
WebSocketHandler
decorate
(
WebSocketHandler
webSocketHandler
)
{
return
new
DeWebSocketHandlerDecorator
(
webSocketHandler
);
}
}
backend/src/main/java/io/dataease/websocket/handler/PrincipalHandshakeHandler.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
handler
;
import
io.dataease.websocket.entity.DePrincipal
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.http.server.ServerHttpRequest
;
import
org.springframework.http.server.ServletServerHttpRequest
;
import
org.springframework.web.socket.WebSocketHandler
;
import
org.springframework.web.socket.server.support.DefaultHandshakeHandler
;
import
javax.servlet.http.HttpServletRequest
;
import
java.security.Principal
;
import
java.util.Map
;
public
class
PrincipalHandshakeHandler
extends
DefaultHandshakeHandler
{
@Override
protected
Principal
determineUser
(
ServerHttpRequest
request
,
WebSocketHandler
wsHandler
,
Map
<
String
,
Object
>
attributes
)
{
if
(
request
instanceof
ServletServerHttpRequest
)
{
ServletServerHttpRequest
servletServerHttpRequest
=
(
ServletServerHttpRequest
)
request
;
HttpServletRequest
httpRequest
=
servletServerHttpRequest
.
getServletRequest
();
final
String
userId
=
httpRequest
.
getParameter
(
"userId"
);
if
(
StringUtils
.
isEmpty
(
userId
))
{
return
null
;
}
return
new
DePrincipal
(
userId
);
}
return
null
;
//return super.determineUser(request, wsHandler, attributes);
}
}
backend/src/main/java/io/dataease/websocket/service/WsService.java
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
service
;
package
io
.
dataease
.
websocket
.
service
;
import
io.dataease.websocket.entity.WsMessage
;
import
io.dataease.websocket.entity.WsMessage
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.springframework.messaging.simp.SimpMessagingTemplate
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.List
;
import
java.util.Optional
;
@Component
public
interface
WsService
{
public
class
WsService
{
void
releaseMessage
(
WsMessage
wsMessage
);
@Resource
private
SimpMessagingTemplate
messagingTemplate
;
public
void
releaseMessage
(
List
<
WsMessage
>
wsMessages
)
{
Optional
.
ofNullable
(
wsMessages
).
ifPresent
(
messages
->
{
messages
.
forEach
(
this
::
releaseMessage
);
});
}
public
void
releaseMessage
(
WsMessage
wsMessage
){
if
(
ObjectUtils
.
isEmpty
(
wsMessage
)
||
ObjectUtils
.
isEmpty
(
wsMessage
.
getUserId
())
||
ObjectUtils
.
isEmpty
(
wsMessage
.
getTopic
()))
return
;
messagingTemplate
.
convertAndSendToUser
(
String
.
valueOf
(
wsMessage
.
getUserId
()),
wsMessage
.
getTopic
(),
wsMessage
.
getData
());
}
}
}
backend/src/main/java/io/dataease/websocket/service/impl/DistributedWsService.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
service
.
impl
;
import
io.dataease.commons.condition.RedisStatusCondition
;
import
io.dataease.commons.constants.RedisConstants
;
import
io.dataease.commons.model.RedisMessage
;
import
io.dataease.websocket.entity.WsMessage
;
import
io.dataease.websocket.service.WsService
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Conditional
;
import
org.springframework.context.annotation.Primary
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Component
;
@Component
@Conditional
({
RedisStatusCondition
.
class
})
@Primary
public
class
DistributedWsService
implements
WsService
{
@Autowired
private
RedisTemplate
redisTemplate
;
public
void
releaseMessage
(
WsMessage
wsMessage
){
if
(
ObjectUtils
.
isEmpty
(
wsMessage
)
||
ObjectUtils
.
isEmpty
(
wsMessage
.
getUserId
())
||
ObjectUtils
.
isEmpty
(
wsMessage
.
getTopic
()))
return
;
RedisMessage
<
WsMessage
>
msg
=
new
RedisMessage
();
msg
.
setType
(
RedisConstants
.
WEBSOCKET_MSG
);
msg
.
setData
(
wsMessage
);
redisTemplate
.
convertAndSend
(
RedisConstants
.
GLOBAL_REDIS_TOPIC
,
msg
);
}
}
backend/src/main/java/io/dataease/websocket/service/impl/StandaloneWsService.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
service
.
impl
;
import
io.dataease.websocket.entity.WsMessage
;
import
io.dataease.websocket.service.WsService
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.springframework.messaging.simp.SimpMessagingTemplate
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.Resource
;
@Service
public
class
StandaloneWsService
implements
WsService
{
@Resource
private
SimpMessagingTemplate
messagingTemplate
;
public
void
releaseMessage
(
WsMessage
wsMessage
){
if
(
ObjectUtils
.
isEmpty
(
wsMessage
)
||
ObjectUtils
.
isEmpty
(
wsMessage
.
getUserId
())
||
ObjectUtils
.
isEmpty
(
wsMessage
.
getTopic
()))
return
;
messagingTemplate
.
convertAndSendToUser
(
String
.
valueOf
(
wsMessage
.
getUserId
()),
wsMessage
.
getTopic
(),
wsMessage
.
getData
());
}
}
backend/src/main/java/io/dataease/websocket/util/WsUtil.java
0 → 100644
浏览文件 @
0c16ca38
package
io
.
dataease
.
websocket
.
util
;
import
io.dataease.auth.api.dto.CurrentUserDto
;
import
io.dataease.commons.utils.AuthUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
import
java.util.concurrent.CopyOnWriteArraySet
;
public
class
WsUtil
{
private
static
final
CopyOnWriteArraySet
<
Long
>
ONLINE_USERS
=
new
CopyOnWriteArraySet
();
public
static
boolean
onLine
()
{
CurrentUserDto
user
=
AuthUtils
.
getUser
();
if
(
ObjectUtils
.
isNotEmpty
(
user
)
&&
ObjectUtils
.
isNotEmpty
(
user
.
getUserId
()))
return
onLine
(
user
.
getUserId
());
return
false
;
}
public
static
boolean
onLine
(
Long
userId
)
{
return
ONLINE_USERS
.
add
(
userId
);
}
public
static
boolean
offLine
()
{
CurrentUserDto
user
=
AuthUtils
.
getUser
();
if
(
ObjectUtils
.
isNotEmpty
(
user
)
&&
ObjectUtils
.
isNotEmpty
(
user
.
getUserId
()))
return
offLine
(
user
.
getUserId
());
return
false
;
}
public
static
boolean
offLine
(
Long
userId
)
{
return
ONLINE_USERS
.
remove
(
userId
);
}
public
static
boolean
isOnLine
(
Long
userId
)
{
return
ONLINE_USERS
.
contains
(
userId
);
}
/*public static void releaseMessage(WsMessage wsMessage){
if(ObjectUtils.isEmpty(wsMessage) || ObjectUtils.isEmpty(wsMessage.getUserId()) || ObjectUtils.isEmpty(wsMessage.getTopic())) return;
CommonBeanFactory.getBean()
}*/
}
frontend/src/components/Notification/index.vue
浏览文件 @
0c16ca38
...
@@ -48,7 +48,7 @@
...
@@ -48,7 +48,7 @@
</div>
</div>
</div>
</div>
<div
slot=
"reference"
>
<div
slot=
"reference"
>
<el-badge
:value=
"visible ? paginationConfig.total : count"
:hidden=
"!count && !paginationConfig.total"
:max=
"99"
class=
"item"
>
<el-badge
:value=
"visible
&& !loading
? paginationConfig.total : count"
:hidden=
"!count && !paginationConfig.total"
:max=
"99"
class=
"item"
>
<svg-icon
class-name=
"notification"
icon-class=
"notification"
/>
<svg-icon
class-name=
"notification"
icon-class=
"notification"
/>
</el-badge>
</el-badge>
...
...
frontend/src/websocket/index.js
浏览文件 @
0c16ca38
...
@@ -46,11 +46,12 @@ class DeWebsocket {
...
@@ -46,11 +46,12 @@ class DeWebsocket {
}
}
connection
()
{
connection
()
{
const
socket
=
new
SockJS
(
this
.
ws_url
)
/* const socket = new SockJS('http://localhost:8081' + this.ws_url) */
if
(
!
this
.
isLoginStatu
())
{
if
(
!
this
.
isLoginStatu
())
{
return
return
}
}
const
socket
=
new
SockJS
(
this
.
ws_url
+
'?userId='
+
store
.
state
.
user
.
user
.
userId
)
/* const socket = new SockJS('http://localhost:8081' + this.ws_url) */
this
.
client
=
Stomp
.
over
(
socket
)
this
.
client
=
Stomp
.
over
(
socket
)
const
heads
=
{
const
heads
=
{
/* Authorization: '', */
/* Authorization: '', */
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论