Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
8b4f60b8
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8b4f60b8
编写于
8月 29, 2016
作者:
R
Rossen Stoyanchev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Support receipt on DISCONNECT with simple broker
Issue: SPR-14568
上级
3b95e0b6
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
80 addition
and
10 deletion
+80
-10
spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java
...ngframework/messaging/simp/SimpMessageHeaderAccessor.java
+2
-0
spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java
...ork/messaging/simp/broker/SimpleBrokerMessageHandler.java
+6
-3
spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java
...essaging/simp/broker/SimpleBrokerMessageHandlerTests.java
+18
-5
spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java
...amework/web/socket/messaging/StompSubProtocolHandler.java
+20
-2
spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java
...rk/web/socket/messaging/StompSubProtocolHandlerTests.java
+34
-0
未找到文件。
spring-messaging/src/main/java/org/springframework/messaging/simp/SimpMessageHeaderAccessor.java
浏览文件 @
8b4f60b8
...
@@ -65,6 +65,8 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor {
...
@@ -65,6 +65,8 @@ public class SimpMessageHeaderAccessor extends NativeMessageHeaderAccessor {
public
static
final
String
CONNECT_MESSAGE_HEADER
=
"simpConnectMessage"
;
public
static
final
String
CONNECT_MESSAGE_HEADER
=
"simpConnectMessage"
;
public
static
final
String
DISCONNECT_MESSAGE_HEADER
=
"simpDisconnectMessage"
;
public
static
final
String
HEART_BEAT_HEADER
=
"simpHeartbeat"
;
public
static
final
String
HEART_BEAT_HEADER
=
"simpHeartbeat"
;
...
...
spring-messaging/src/main/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandler.java
浏览文件 @
8b4f60b8
...
@@ -275,7 +275,7 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler {
...
@@ -275,7 +275,7 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler {
}
}
else
if
(
SimpMessageType
.
DISCONNECT
.
equals
(
messageType
))
{
else
if
(
SimpMessageType
.
DISCONNECT
.
equals
(
messageType
))
{
logMessage
(
message
);
logMessage
(
message
);
handleDisconnect
(
sessionId
,
user
);
handleDisconnect
(
sessionId
,
user
,
message
);
}
}
else
if
(
SimpMessageType
.
SUBSCRIBE
.
equals
(
messageType
))
{
else
if
(
SimpMessageType
.
SUBSCRIBE
.
equals
(
messageType
))
{
logMessage
(
message
);
logMessage
(
message
);
...
@@ -310,12 +310,15 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler {
...
@@ -310,12 +310,15 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler {
}
}
}
}
private
void
handleDisconnect
(
String
sessionId
,
Principal
user
)
{
private
void
handleDisconnect
(
String
sessionId
,
Principal
user
,
Message
<?>
origMessage
)
{
this
.
sessions
.
remove
(
sessionId
);
this
.
sessions
.
remove
(
sessionId
);
this
.
subscriptionRegistry
.
unregisterAllSubscriptions
(
sessionId
);
this
.
subscriptionRegistry
.
unregisterAllSubscriptions
(
sessionId
);
SimpMessageHeaderAccessor
accessor
=
SimpMessageHeaderAccessor
.
create
(
SimpMessageType
.
DISCONNECT_ACK
);
SimpMessageHeaderAccessor
accessor
=
SimpMessageHeaderAccessor
.
create
(
SimpMessageType
.
DISCONNECT_ACK
);
accessor
.
setSessionId
(
sessionId
);
accessor
.
setSessionId
(
sessionId
);
accessor
.
setUser
(
user
);
accessor
.
setUser
(
user
);
if
(
origMessage
!=
null
)
{
accessor
.
setHeader
(
SimpMessageHeaderAccessor
.
DISCONNECT_MESSAGE_HEADER
,
origMessage
);
}
initHeaders
(
accessor
);
initHeaders
(
accessor
);
Message
<
byte
[]>
message
=
MessageBuilder
.
createMessage
(
EMPTY_PAYLOAD
,
accessor
.
getMessageHeaders
());
Message
<
byte
[]>
message
=
MessageBuilder
.
createMessage
(
EMPTY_PAYLOAD
,
accessor
.
getMessageHeaders
());
getClientOutboundChannel
().
send
(
message
);
getClientOutboundChannel
().
send
(
message
);
...
@@ -432,7 +435,7 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler {
...
@@ -432,7 +435,7 @@ public class SimpleBrokerMessageHandler extends AbstractBrokerMessageHandler {
long
now
=
System
.
currentTimeMillis
();
long
now
=
System
.
currentTimeMillis
();
for
(
SessionInfo
info
:
sessions
.
values
())
{
for
(
SessionInfo
info
:
sessions
.
values
())
{
if
(
info
.
getReadInterval
()
>
0
&&
(
now
-
info
.
getLastReadTime
())
>
info
.
getReadInterval
())
{
if
(
info
.
getReadInterval
()
>
0
&&
(
now
-
info
.
getLastReadTime
())
>
info
.
getReadInterval
())
{
handleDisconnect
(
info
.
getSessiondId
(),
info
.
getUser
());
handleDisconnect
(
info
.
getSessiondId
(),
info
.
getUser
()
,
null
);
}
}
if
(
info
.
getWriteInterval
()
>
0
&&
(
now
-
info
.
getLastWriteTime
())
>
info
.
getWriteInterval
())
{
if
(
info
.
getWriteInterval
()
>
0
&&
(
now
-
info
.
getLastWriteTime
())
>
info
.
getWriteInterval
())
{
SimpMessageHeaderAccessor
accessor
=
SimpMessageHeaderAccessor
.
create
(
SimpMessageType
.
HEARTBEAT
);
SimpMessageHeaderAccessor
accessor
=
SimpMessageHeaderAccessor
.
create
(
SimpMessageType
.
HEARTBEAT
);
...
...
spring-messaging/src/test/java/org/springframework/messaging/simp/broker/SimpleBrokerMessageHandlerTests.java
浏览文件 @
8b4f60b8
/*
/*
* Copyright 2002-201
5
the original author or authors.
* Copyright 2002-201
6
the original author or authors.
*
*
* Licensed under the Apache License, Version 2.0 (the "License");
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* you may not use this file except in compliance with the License.
...
@@ -16,9 +16,6 @@
...
@@ -16,9 +16,6 @@
package
org.springframework.messaging.simp.broker
;
package
org.springframework.messaging.simp.broker
;
import
static
org
.
junit
.
Assert
.*;
import
static
org
.
mockito
.
Mockito
.*;
import
java.security.Principal
;
import
java.security.Principal
;
import
java.util.Collections
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.List
;
...
@@ -41,6 +38,21 @@ import org.springframework.messaging.simp.TestPrincipal;
...
@@ -41,6 +38,21 @@ import org.springframework.messaging.simp.TestPrincipal;
import
org.springframework.messaging.support.MessageBuilder
;
import
org.springframework.messaging.support.MessageBuilder
;
import
org.springframework.scheduling.TaskScheduler
;
import
org.springframework.scheduling.TaskScheduler
;
import
static
org
.
junit
.
Assert
.
assertArrayEquals
;
import
static
org
.
junit
.
Assert
.
assertEquals
;
import
static
org
.
junit
.
Assert
.
assertNotNull
;
import
static
org
.
junit
.
Assert
.
assertNull
;
import
static
org
.
junit
.
Assert
.
assertSame
;
import
static
org
.
junit
.
Assert
.
assertTrue
;
import
static
org
.
mockito
.
Mockito
.
any
;
import
static
org
.
mockito
.
Mockito
.
atLeast
;
import
static
org
.
mockito
.
Mockito
.
eq
;
import
static
org
.
mockito
.
Mockito
.
mock
;
import
static
org
.
mockito
.
Mockito
.
times
;
import
static
org
.
mockito
.
Mockito
.
verify
;
import
static
org
.
mockito
.
Mockito
.
verifyNoMoreInteractions
;
import
static
org
.
mockito
.
Mockito
.
when
;
/**
/**
* Unit tests for SimpleBrokerMessageHandler.
* Unit tests for SimpleBrokerMessageHandler.
*
*
...
@@ -72,7 +84,7 @@ public class SimpleBrokerMessageHandlerTests {
...
@@ -72,7 +84,7 @@ public class SimpleBrokerMessageHandlerTests {
public
void
setup
()
{
public
void
setup
()
{
MockitoAnnotations
.
initMocks
(
this
);
MockitoAnnotations
.
initMocks
(
this
);
this
.
messageHandler
=
new
SimpleBrokerMessageHandler
(
this
.
clientInboundChannel
,
this
.
messageHandler
=
new
SimpleBrokerMessageHandler
(
this
.
clientInboundChannel
,
this
.
clientOutboundChannel
,
this
.
brokerChannel
,
Collections
.
<
String
>
emptyList
());
this
.
clientOutboundChannel
,
this
.
brokerChannel
,
Collections
.
emptyList
());
}
}
...
@@ -130,6 +142,7 @@ public class SimpleBrokerMessageHandlerTests {
...
@@ -130,6 +142,7 @@ public class SimpleBrokerMessageHandlerTests {
Message
<?>
captured
=
this
.
messageCaptor
.
getAllValues
().
get
(
0
);
Message
<?>
captured
=
this
.
messageCaptor
.
getAllValues
().
get
(
0
);
assertEquals
(
SimpMessageType
.
DISCONNECT_ACK
,
SimpMessageHeaderAccessor
.
getMessageType
(
captured
.
getHeaders
()));
assertEquals
(
SimpMessageType
.
DISCONNECT_ACK
,
SimpMessageHeaderAccessor
.
getMessageType
(
captured
.
getHeaders
()));
assertSame
(
message
,
captured
.
getHeaders
().
get
(
SimpMessageHeaderAccessor
.
DISCONNECT_MESSAGE_HEADER
));
assertEquals
(
sess1
,
SimpMessageHeaderAccessor
.
getSessionId
(
captured
.
getHeaders
()));
assertEquals
(
sess1
,
SimpMessageHeaderAccessor
.
getSessionId
(
captured
.
getHeaders
()));
assertEquals
(
"joe"
,
SimpMessageHeaderAccessor
.
getUser
(
captured
.
getHeaders
()).
getName
());
assertEquals
(
"joe"
,
SimpMessageHeaderAccessor
.
getUser
(
captured
.
getHeaders
()).
getName
());
...
...
spring-websocket/src/main/java/org/springframework/web/socket/messaging/StompSubProtocolHandler.java
浏览文件 @
8b4f60b8
...
@@ -34,6 +34,7 @@ import org.springframework.context.ApplicationEventPublisher;
...
@@ -34,6 +34,7 @@ import org.springframework.context.ApplicationEventPublisher;
import
org.springframework.context.ApplicationEventPublisherAware
;
import
org.springframework.context.ApplicationEventPublisherAware
;
import
org.springframework.messaging.Message
;
import
org.springframework.messaging.Message
;
import
org.springframework.messaging.MessageChannel
;
import
org.springframework.messaging.MessageChannel
;
import
org.springframework.messaging.MessageHeaders
;
import
org.springframework.messaging.simp.SimpAttributes
;
import
org.springframework.messaging.simp.SimpAttributes
;
import
org.springframework.messaging.simp.SimpAttributesContextHolder
;
import
org.springframework.messaging.simp.SimpAttributesContextHolder
;
import
org.springframework.messaging.simp.SimpMessageHeaderAccessor
;
import
org.springframework.messaging.simp.SimpMessageHeaderAccessor
;
...
@@ -449,9 +450,16 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
...
@@ -449,9 +450,16 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
stompAccessor
=
convertConnectAcktoStompConnected
(
stompAccessor
);
stompAccessor
=
convertConnectAcktoStompConnected
(
stompAccessor
);
}
}
else
if
(
SimpMessageType
.
DISCONNECT_ACK
.
equals
(
messageType
))
{
else
if
(
SimpMessageType
.
DISCONNECT_ACK
.
equals
(
messageType
))
{
String
receipt
=
getDisconnectReceipt
(
stompAccessor
);
if
(
receipt
!=
null
)
{
stompAccessor
=
StompHeaderAccessor
.
create
(
StompCommand
.
RECEIPT
);
stompAccessor
.
setReceiptId
(
receipt
);
}
else
{
stompAccessor
=
StompHeaderAccessor
.
create
(
StompCommand
.
ERROR
);
stompAccessor
=
StompHeaderAccessor
.
create
(
StompCommand
.
ERROR
);
stompAccessor
.
setMessage
(
"Session closed."
);
stompAccessor
.
setMessage
(
"Session closed."
);
}
}
}
else
if
(
SimpMessageType
.
HEARTBEAT
.
equals
(
messageType
))
{
else
if
(
SimpMessageType
.
HEARTBEAT
.
equals
(
messageType
))
{
stompAccessor
=
StompHeaderAccessor
.
createForHeartbeat
();
stompAccessor
=
StompHeaderAccessor
.
createForHeartbeat
();
}
}
...
@@ -503,6 +511,16 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
...
@@ -503,6 +511,16 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
return
connectedHeaders
;
return
connectedHeaders
;
}
}
private
String
getDisconnectReceipt
(
SimpMessageHeaderAccessor
simpHeaders
)
{
String
name
=
StompHeaderAccessor
.
DISCONNECT_MESSAGE_HEADER
;
Message
<?>
message
=
(
Message
<?>)
simpHeaders
.
getHeader
(
name
);
if
(
message
!=
null
)
{
StompHeaderAccessor
accessor
=
MessageHeaderAccessor
.
getAccessor
(
message
,
StompHeaderAccessor
.
class
);
return
accessor
.
getReceipt
();
}
return
null
;
}
protected
StompHeaderAccessor
toMutableAccessor
(
StompHeaderAccessor
headerAccessor
,
Message
<?>
message
)
{
protected
StompHeaderAccessor
toMutableAccessor
(
StompHeaderAccessor
headerAccessor
,
Message
<?>
message
)
{
return
(
headerAccessor
.
isMutable
()
?
headerAccessor
:
StompHeaderAccessor
.
wrap
(
message
));
return
(
headerAccessor
.
isMutable
()
?
headerAccessor
:
StompHeaderAccessor
.
wrap
(
message
));
}
}
...
...
spring-websocket/src/test/java/org/springframework/web/socket/messaging/StompSubProtocolHandlerTests.java
浏览文件 @
8b4f60b8
...
@@ -169,6 +169,40 @@ public class StompSubProtocolHandlerTests {
...
@@ -169,6 +169,40 @@ public class StompSubProtocolHandlerTests {
"user-name:joe\n"
+
"\n"
+
"\u0000"
,
actual
.
getPayload
());
"user-name:joe\n"
+
"\n"
+
"\u0000"
,
actual
.
getPayload
());
}
}
@Test
public
void
handleMessageToClientWithSimpDisconnectAck
()
{
StompHeaderAccessor
accessor
=
StompHeaderAccessor
.
create
(
StompCommand
.
DISCONNECT
);
Message
<?>
connectMessage
=
MessageBuilder
.
createMessage
(
EMPTY_PAYLOAD
,
accessor
.
getMessageHeaders
());
SimpMessageHeaderAccessor
ackAccessor
=
SimpMessageHeaderAccessor
.
create
(
SimpMessageType
.
DISCONNECT_ACK
);
ackAccessor
.
setHeader
(
SimpMessageHeaderAccessor
.
DISCONNECT_MESSAGE_HEADER
,
connectMessage
);
Message
<
byte
[]>
ackMessage
=
MessageBuilder
.
createMessage
(
EMPTY_PAYLOAD
,
ackAccessor
.
getMessageHeaders
());
this
.
protocolHandler
.
handleMessageToClient
(
this
.
session
,
ackMessage
);
assertEquals
(
1
,
this
.
session
.
getSentMessages
().
size
());
TextMessage
actual
=
(
TextMessage
)
this
.
session
.
getSentMessages
().
get
(
0
);
assertEquals
(
"ERROR\n"
+
"message:Session closed.\n"
+
"content-length:0\n"
+
"\n\u0000"
,
actual
.
getPayload
());
}
@Test
public
void
handleMessageToClientWithSimpDisconnectAckAndReceipt
()
{
StompHeaderAccessor
accessor
=
StompHeaderAccessor
.
create
(
StompCommand
.
DISCONNECT
);
accessor
.
setReceipt
(
"message-123"
);
Message
<?>
connectMessage
=
MessageBuilder
.
createMessage
(
EMPTY_PAYLOAD
,
accessor
.
getMessageHeaders
());
SimpMessageHeaderAccessor
ackAccessor
=
SimpMessageHeaderAccessor
.
create
(
SimpMessageType
.
DISCONNECT_ACK
);
ackAccessor
.
setHeader
(
SimpMessageHeaderAccessor
.
DISCONNECT_MESSAGE_HEADER
,
connectMessage
);
Message
<
byte
[]>
ackMessage
=
MessageBuilder
.
createMessage
(
EMPTY_PAYLOAD
,
ackAccessor
.
getMessageHeaders
());
this
.
protocolHandler
.
handleMessageToClient
(
this
.
session
,
ackMessage
);
assertEquals
(
1
,
this
.
session
.
getSentMessages
().
size
());
TextMessage
actual
=
(
TextMessage
)
this
.
session
.
getSentMessages
().
get
(
0
);
assertEquals
(
"RECEIPT\n"
+
"receipt-id:message-123\n"
+
"\n\u0000"
,
actual
.
getPayload
());
}
@Test
@Test
public
void
handleMessageToClientWithSimpHeartbeat
()
{
public
void
handleMessageToClientWithSimpHeartbeat
()
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录