Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
ef823721
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,发现更多精彩内容 >>
提交
ef823721
编写于
7月 04, 2013
作者:
R
Rossen Stoyanchev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Split AbstractMessagingTemplate across send/receive
上级
078c766b
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
106 addition
and
277 deletion
+106
-277
spring-context/src/main/java/org/springframework/messaging/core/AbstractDestinationResolvingMessagingTemplate.java
...g/core/AbstractDestinationResolvingMessagingTemplate.java
+1
-1
spring-context/src/main/java/org/springframework/messaging/core/AbstractMessagingTemplate.java
...ngframework/messaging/core/AbstractMessagingTemplate.java
+2
-66
spring-context/src/main/java/org/springframework/messaging/core/AbstractReceivingMessagingTemplate.java
...rk/messaging/core/AbstractReceivingMessagingTemplate.java
+92
-0
spring-context/src/main/java/org/springframework/messaging/core/DefaultMessagingTemplate.java
...ingframework/messaging/core/DefaultMessagingTemplate.java
+1
-1
spring-context/src/test/java/org/springframework/messaging/PublishSubscibeChannelTests.java
...pringframework/messaging/PublishSubscibeChannelTests.java
+0
-144
spring-websocket/src/main/java/org/springframework/web/messaging/support/WebMessagingTemplate.java
...framework/web/messaging/support/WebMessagingTemplate.java
+10
-65
未找到文件。
spring-context/src/main/java/org/springframework/messaging/core/AbstractDestinationResolvingMessagingTemplate.java
浏览文件 @
ef823721
...
...
@@ -23,7 +23,7 @@ import org.springframework.util.Assert;
* @author Mark Fisher
* @since 4.0
*/
public
abstract
class
AbstractDestinationResolvingMessagingTemplate
<
D
>
extends
AbstractMessagingTemplate
<
D
>
public
abstract
class
AbstractDestinationResolvingMessagingTemplate
<
D
>
extends
Abstract
Receiving
MessagingTemplate
<
D
>
implements
ResolvableDestinationMessageReceivingOperations
<
D
>
{
private
volatile
DestinationResolver
<
D
>
destinationResolver
;
...
...
spring-context/src/main/java/org/springframework/messaging/core/AbstractMessagingTemplate.java
浏览文件 @
ef823721
...
...
@@ -28,7 +28,7 @@ import org.springframework.util.Assert;
* @author Mark Fisher
* @since 4.0
*/
public
abstract
class
AbstractMessagingTemplate
<
D
>
implements
Message
Receiv
ingOperations
<
D
>
{
public
abstract
class
AbstractMessagingTemplate
<
D
>
implements
Message
Send
ingOperations
<
D
>
{
protected
final
Log
logger
=
LogFactory
.
getLog
(
this
.
getClass
());
...
...
@@ -57,7 +57,7 @@ public abstract class AbstractMessagingTemplate<D> implements MessageReceivingOp
this
.
send
(
getRequiredDefaultDestination
(),
message
);
}
pr
ivate
D
getRequiredDefaultDestination
()
{
pr
otected
final
D
getRequiredDefaultDestination
()
{
Assert
.
state
(
this
.
defaultDestination
!=
null
,
"No 'defaultDestination' specified for MessagingTemplate. "
+
"Unable to invoke method without an explicit destination argument."
);
...
...
@@ -98,68 +98,4 @@ public abstract class AbstractMessagingTemplate<D> implements MessageReceivingOp
this
.
send
(
destination
,
message
);
}
@Override
public
<
P
>
Message
<
P
>
receive
()
{
return
this
.
receive
(
getRequiredDefaultDestination
());
}
@Override
public
<
P
>
Message
<
P
>
receive
(
D
destination
)
{
return
this
.
doReceive
(
destination
);
}
protected
abstract
<
P
>
Message
<
P
>
doReceive
(
D
destination
);
@Override
public
Object
receiveAndConvert
()
{
return
this
.
receiveAndConvert
(
getRequiredDefaultDestination
());
}
@Override
public
Object
receiveAndConvert
(
D
destination
)
{
Message
<
Object
>
message
=
this
.
doReceive
(
destination
);
return
(
message
!=
null
)
?
this
.
converter
.
fromMessage
(
message
)
:
null
;
}
@Override
public
Message
<?>
sendAndReceive
(
Message
<?>
requestMessage
)
{
return
this
.
sendAndReceive
(
getRequiredDefaultDestination
(),
requestMessage
);
}
@Override
public
Message
<?>
sendAndReceive
(
D
destination
,
Message
<?>
requestMessage
)
{
return
this
.
doSendAndReceive
(
destination
,
requestMessage
);
}
protected
abstract
<
S
,
R
>
Message
<
R
>
doSendAndReceive
(
D
destination
,
Message
<
S
>
requestMessage
);
@Override
public
Object
convertSendAndReceive
(
Object
request
)
{
return
this
.
convertSendAndReceive
(
getRequiredDefaultDestination
(),
request
);
}
@Override
public
Object
convertSendAndReceive
(
D
destination
,
Object
request
)
{
return
this
.
convertSendAndReceive
(
destination
,
request
,
null
);
}
@Override
public
Object
convertSendAndReceive
(
Object
request
,
MessagePostProcessor
postProcessor
)
{
return
this
.
convertSendAndReceive
(
getRequiredDefaultDestination
(),
request
,
postProcessor
);
}
@Override
public
Object
convertSendAndReceive
(
D
destination
,
Object
request
,
MessagePostProcessor
postProcessor
)
{
Message
<?>
requestMessage
=
this
.
converter
.
toMessage
(
request
);
if
(
postProcessor
!=
null
)
{
requestMessage
=
postProcessor
.
postProcessMessage
(
requestMessage
);
}
Message
<?>
replyMessage
=
this
.
sendAndReceive
(
destination
,
requestMessage
);
return
this
.
converter
.
fromMessage
(
replyMessage
);
}
}
spring-context/src/main/java/org/springframework/messaging/core/AbstractReceivingMessagingTemplate.java
0 → 100644
浏览文件 @
ef823721
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.messaging.core
;
import
org.springframework.messaging.Message
;
/**
* @author Mark Fisher
* @since 4.0
*/
public
abstract
class
AbstractReceivingMessagingTemplate
<
D
>
extends
AbstractMessagingTemplate
<
D
>
implements
MessageReceivingOperations
<
D
>
{
@Override
public
<
P
>
Message
<
P
>
receive
()
{
return
this
.
receive
(
getRequiredDefaultDestination
());
}
@Override
public
<
P
>
Message
<
P
>
receive
(
D
destination
)
{
return
this
.
doReceive
(
destination
);
}
protected
abstract
<
P
>
Message
<
P
>
doReceive
(
D
destination
);
@Override
public
Object
receiveAndConvert
()
{
return
this
.
receiveAndConvert
(
getRequiredDefaultDestination
());
}
@Override
public
Object
receiveAndConvert
(
D
destination
)
{
Message
<
Object
>
message
=
this
.
doReceive
(
destination
);
return
(
message
!=
null
)
?
this
.
converter
.
fromMessage
(
message
)
:
null
;
}
@Override
public
Message
<?>
sendAndReceive
(
Message
<?>
requestMessage
)
{
return
this
.
sendAndReceive
(
getRequiredDefaultDestination
(),
requestMessage
);
}
@Override
public
Message
<?>
sendAndReceive
(
D
destination
,
Message
<?>
requestMessage
)
{
return
this
.
doSendAndReceive
(
destination
,
requestMessage
);
}
protected
abstract
<
S
,
R
>
Message
<
R
>
doSendAndReceive
(
D
destination
,
Message
<
S
>
requestMessage
);
@Override
public
Object
convertSendAndReceive
(
Object
request
)
{
return
this
.
convertSendAndReceive
(
getRequiredDefaultDestination
(),
request
);
}
@Override
public
Object
convertSendAndReceive
(
D
destination
,
Object
request
)
{
return
this
.
convertSendAndReceive
(
destination
,
request
,
null
);
}
@Override
public
Object
convertSendAndReceive
(
Object
request
,
MessagePostProcessor
postProcessor
)
{
return
this
.
convertSendAndReceive
(
getRequiredDefaultDestination
(),
request
,
postProcessor
);
}
@Override
public
Object
convertSendAndReceive
(
D
destination
,
Object
request
,
MessagePostProcessor
postProcessor
)
{
Message
<?>
requestMessage
=
this
.
converter
.
toMessage
(
request
);
if
(
postProcessor
!=
null
)
{
requestMessage
=
postProcessor
.
postProcessMessage
(
requestMessage
);
}
Message
<?>
replyMessage
=
this
.
sendAndReceive
(
destination
,
requestMessage
);
return
this
.
converter
.
fromMessage
(
replyMessage
);
}
}
spring-context/src/main/java/org/springframework/messaging/core/
Integration
Template.java
→
spring-context/src/main/java/org/springframework/messaging/core/
DefaultMessaging
Template.java
浏览文件 @
ef823721
...
...
@@ -37,7 +37,7 @@ import org.springframework.util.Assert;
* @author Mark Fisher
* @since 4.0
*/
public
class
Integration
Template
extends
AbstractDestinationResolvingMessagingTemplate
<
MessageChannel
>
public
class
DefaultMessaging
Template
extends
AbstractDestinationResolvingMessagingTemplate
<
MessageChannel
>
implements
BeanFactoryAware
{
private
volatile
long
sendTimeout
=
-
1
;
...
...
spring-context/src/test/java/org/springframework/messaging/PublishSubscibeChannelTests.java
已删除
100644 → 0
浏览文件 @
078c766b
/*
* Copyright 2002-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.messaging
;
import
java.util.concurrent.Executor
;
import
org.junit.Before
;
import
org.junit.Rule
;
import
org.junit.Test
;
import
org.junit.rules.ExpectedException
;
import
org.mockito.ArgumentCaptor
;
import
org.mockito.Captor
;
import
org.mockito.Mock
;
import
org.mockito.MockitoAnnotations
;
import
org.springframework.messaging.support.MessageBuilder
;
import
static
org
.
hamcrest
.
Matchers
.*;
import
static
org
.
junit
.
Assert
.*;
import
static
org
.
mockito
.
BDDMockito
.*;
/**
* Tests for {@link PublishSubscribeChannel}.
*
* @author Phillip Webb
*/
public
class
PublishSubscibeChannelTests
{
@Rule
public
ExpectedException
thrown
=
ExpectedException
.
none
();
private
PublishSubscribeChannel
channel
=
new
PublishSubscribeChannel
();
@Mock
private
MessageHandler
handler
;
private
final
Object
payload
=
new
Object
();
private
final
Message
<
Object
>
message
=
MessageBuilder
.
withPayload
(
this
.
payload
).
build
();
@Captor
private
ArgumentCaptor
<
Runnable
>
runnableCaptor
;
@Before
public
void
setup
()
{
MockitoAnnotations
.
initMocks
(
this
);
}
@Test
public
void
messageMustNotBeNull
()
throws
Exception
{
thrown
.
expect
(
IllegalArgumentException
.
class
);
thrown
.
expectMessage
(
"Message must not be null"
);
this
.
channel
.
send
(
null
);
}
@Test
public
void
payloadMustNotBeNull
()
throws
Exception
{
Message
<?>
message
=
mock
(
Message
.
class
);
thrown
.
expect
(
IllegalArgumentException
.
class
);
thrown
.
expectMessage
(
"Message payload must not be null"
);
this
.
channel
.
send
(
message
);
}
@Test
public
void
sendWithoutExecutor
()
{
this
.
channel
.
subscribe
(
this
.
handler
);
this
.
channel
.
send
(
this
.
message
);
verify
(
this
.
handler
).
handleMessage
(
this
.
message
);
}
@Test
public
void
sendWithExecutor
()
throws
Exception
{
Executor
executor
=
mock
(
Executor
.
class
);
this
.
channel
=
new
PublishSubscribeChannel
(
executor
);
this
.
channel
.
subscribe
(
this
.
handler
);
this
.
channel
.
send
(
this
.
message
);
verify
(
executor
).
execute
(
this
.
runnableCaptor
.
capture
());
verify
(
this
.
handler
,
never
()).
handleMessage
(
this
.
message
);
this
.
runnableCaptor
.
getValue
().
run
();
verify
(
this
.
handler
).
handleMessage
(
this
.
message
);
}
@Test
public
void
subscribeTwice
()
throws
Exception
{
assertThat
(
this
.
channel
.
subscribe
(
this
.
handler
),
equalTo
(
true
));
assertThat
(
this
.
channel
.
subscribe
(
this
.
handler
),
equalTo
(
false
));
this
.
channel
.
send
(
this
.
message
);
verify
(
this
.
handler
,
times
(
1
)).
handleMessage
(
this
.
message
);
}
@Test
public
void
unsubscribeTwice
()
throws
Exception
{
this
.
channel
.
subscribe
(
this
.
handler
);
assertThat
(
this
.
channel
.
unsubscribe
(
this
.
handler
),
equalTo
(
true
));
assertThat
(
this
.
channel
.
unsubscribe
(
this
.
handler
),
equalTo
(
false
));
this
.
channel
.
send
(
this
.
message
);
verify
(
this
.
handler
,
never
()).
handleMessage
(
this
.
message
);
}
@Test
public
void
failurePropagates
()
throws
Exception
{
RuntimeException
ex
=
new
RuntimeException
();
willThrow
(
ex
).
given
(
this
.
handler
).
handleMessage
(
this
.
message
);
MessageHandler
secondHandler
=
mock
(
MessageHandler
.
class
);
this
.
channel
.
subscribe
(
this
.
handler
);
this
.
channel
.
subscribe
(
secondHandler
);
try
{
this
.
channel
.
send
(
message
);
}
catch
(
RuntimeException
actualException
)
{
assertThat
(
actualException
,
equalTo
(
ex
));
}
verifyZeroInteractions
(
secondHandler
);
}
@Test
public
void
concurrentModification
()
throws
Exception
{
this
.
channel
.
subscribe
(
new
MessageHandler
()
{
@Override
public
void
handleMessage
(
Message
<?>
message
)
throws
MessagingException
{
channel
.
unsubscribe
(
handler
);
}
});
this
.
channel
.
subscribe
(
this
.
handler
);
this
.
channel
.
send
(
this
.
message
);
verify
(
this
.
handler
).
handleMessage
(
this
.
message
);
}
}
spring-websocket/src/main/java/org/springframework/web/messaging/support/WebMessagingTemplate.java
浏览文件 @
ef823721
...
...
@@ -3,23 +3,16 @@ package org.springframework.web.messaging.support;
import
org.springframework.messaging.Message
;
import
org.springframework.messaging.MessageChannel
;
import
org.springframework.messaging.MessageDeliveryException
;
import
org.springframework.messaging.converter.DefaultMessageConverter
;
import
org.springframework.messaging.converter.MessageConverter
;
import
org.springframework.messaging.core.MessagePostProcessor
;
import
org.springframework.messaging.core.MessageSendingOperations
;
import
org.springframework.messaging.core.AbstractMessagingTemplate
;
import
org.springframework.messaging.support.MessageBuilder
;
import
org.springframework.util.Assert
;
import
org.springframework.web.messaging.MessageType
;
public
class
WebMessagingTemplate
implements
MessageSendingOperations
<
String
>
{
public
class
WebMessagingTemplate
extends
AbstractMessagingTemplate
<
String
>
{
private
final
MessageChannel
outputChannel
;
protected
volatile
MessageConverter
converter
=
new
DefaultMessageConverter
();
private
volatile
String
defaultDestination
;
private
volatile
long
sendTimeout
=
-
1
;
...
...
@@ -29,16 +22,6 @@ public class WebMessagingTemplate implements MessageSendingOperations<String> {
}
/**
* Set the {@link MessageConverter} that is to be used to convert
* between Messages and objects for this template.
* <p>The default is {@link SimpleMessageConverter}.
*/
public
void
setMessageConverter
(
MessageConverter
messageConverter
)
{
Assert
.
notNull
(
messageConverter
,
"'messageConverter' must not be null"
);
this
.
converter
=
messageConverter
;
}
/**
* Specify the timeout value to use for send operations.
*
...
...
@@ -48,72 +31,34 @@ public class WebMessagingTemplate implements MessageSendingOperations<String> {
this
.
sendTimeout
=
sendTimeout
;
}
public
void
setDefaultDestination
(
String
defaultDestination
)
{
this
.
defaultDestination
=
defaultDestination
;
}
@Override
public
<
P
>
void
send
(
Message
<
P
>
message
)
{
this
.
send
(
getRequiredDefaultDestination
(),
message
);
}
private
String
getRequiredDefaultDestination
()
{
// TODO: maybe look up destination of current message (via ThreadLocal)
Assert
.
state
(
this
.
defaultDestination
!=
null
,
"No 'defaultDestination' specified for WebMessagingTemplate. "
+
"Unable to invoke method without an explicit destination argument."
);
return
this
.
defaultDestination
;
this
.
send
(
getRequiredDefaultDestination
(),
message
);
}
@Override
p
ublic
<
P
>
void
send
(
String
destinationName
,
Message
<
P
>
message
)
{
Assert
.
notNull
(
destination
Name
,
"destinationName
is required"
);
message
=
addDestinationToMessage
(
message
,
destination
Name
);
p
rotected
void
doSend
(
String
destination
,
Message
<?
>
message
)
{
Assert
.
notNull
(
destination
,
"destination
is required"
);
message
=
addDestinationToMessage
(
message
,
destination
);
long
timeout
=
this
.
sendTimeout
;
boolean
sent
=
(
timeout
>=
0
)
?
this
.
outputChannel
.
send
(
message
,
timeout
)
:
this
.
outputChannel
.
send
(
message
);
if
(!
sent
)
{
throw
new
MessageDeliveryException
(
message
,
"failed to send message to destination '"
+
destination
Name
+
"' within timeout: "
+
timeout
);
"failed to send message to destination '"
+
destination
+
"' within timeout: "
+
timeout
);
}
}
protected
<
P
>
Message
<
P
>
addDestinationToMessage
(
Message
<
P
>
message
,
String
destination
Name
)
{
Assert
.
notNull
(
destination
Name
,
"destinationName
is required"
);
protected
<
P
>
Message
<
P
>
addDestinationToMessage
(
Message
<
P
>
message
,
String
destination
)
{
Assert
.
notNull
(
destination
,
"destination
is required"
);
WebMessageHeaderAccesssor
headers
=
WebMessageHeaderAccesssor
.
create
(
MessageType
.
MESSAGE
);
headers
.
copyHeaders
(
message
.
getHeaders
());
headers
.
setDestination
(
destination
Name
);
headers
.
setDestination
(
destination
);
message
=
MessageBuilder
.
withPayload
(
message
.
getPayload
()).
copyHeaders
(
headers
.
toMap
()).
build
();
return
message
;
}
@Override
public
<
T
>
void
convertAndSend
(
T
object
)
{
this
.
convertAndSend
(
getRequiredDefaultDestination
(),
object
);
}
@Override
public
<
T
>
void
convertAndSend
(
String
destinationName
,
T
object
)
{
this
.
convertAndSend
(
destinationName
,
object
,
null
);
}
@Override
public
<
T
>
void
convertAndSend
(
T
object
,
MessagePostProcessor
postProcessor
)
{
this
.
convertAndSend
(
getRequiredDefaultDestination
(),
object
,
postProcessor
);
}
@Override
public
<
T
>
void
convertAndSend
(
String
destinationName
,
T
object
,
MessagePostProcessor
postProcessor
)
{
Message
<?>
message
=
this
.
converter
.
toMessage
(
object
);
if
(
postProcessor
!=
null
)
{
message
=
postProcessor
.
postProcessMessage
(
message
);
}
this
.
send
(
destinationName
,
message
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录