Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
70f14c14
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,发现更多精彩内容 >>
提交
70f14c14
编写于
12月 14, 2016
作者:
R
Rossen Stoyanchev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Polish Undertow reactive server support
上级
c3621bf1
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
82 addition
and
89 deletion
+82
-89
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHttpHandlerAdapter.java
...work/http/server/reactive/UndertowHttpHandlerAdapter.java
+47
-29
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java
...ework/http/server/reactive/UndertowServerHttpRequest.java
+16
-39
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java
...work/http/server/reactive/UndertowServerHttpResponse.java
+7
-17
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/UndertowHttpServer.java
...rk/http/server/reactive/bootstrap/UndertowHttpServer.java
+12
-4
未找到文件。
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHttpHandlerAdapter.java
浏览文件 @
70f14c14
...
...
@@ -37,7 +37,7 @@ import org.springframework.util.Assert;
public
class
UndertowHttpHandlerAdapter
extends
HttpHandlerAdapterSupport
implements
io
.
undertow
.
server
.
HttpHandler
{
private
DataBufferFactory
dataB
ufferFactory
=
new
DefaultDataBufferFactory
(
false
);
private
DataBufferFactory
b
ufferFactory
=
new
DefaultDataBufferFactory
(
false
);
public
UndertowHttpHandlerAdapter
(
HttpHandler
httpHandler
)
{
...
...
@@ -49,41 +49,59 @@ public class UndertowHttpHandlerAdapter extends HttpHandlerAdapterSupport
}
public
void
setDataBufferFactory
(
DataBufferFactory
dataBufferFactory
)
{
Assert
.
notNull
(
dataBufferFactory
,
"DataBufferFactory must not be null"
);
this
.
dataBufferFactory
=
dataBufferFactory
;
public
void
setDataBufferFactory
(
DataBufferFactory
bufferFactory
)
{
Assert
.
notNull
(
bufferFactory
,
"DataBufferFactory must not be null"
);
this
.
bufferFactory
=
bufferFactory
;
}
public
DataBufferFactory
getDataBufferFactory
()
{
return
this
.
bufferFactory
;
}
@Override
public
void
handleRequest
(
HttpServerExchange
exchange
)
throws
Exception
{
UndertowServerHttpRequest
request
=
new
UndertowServerHttpRequest
(
exchange
,
this
.
dataBufferFactory
);
ServerHttpResponse
response
=
new
UndertowServerHttpResponse
(
exchange
,
this
.
dataBufferFactory
);
ServerHttpRequest
request
=
new
UndertowServerHttpRequest
(
exchange
,
getDataBufferFactory
()
);
ServerHttpResponse
response
=
new
UndertowServerHttpResponse
(
exchange
,
getDataBufferFactory
()
);
getHttpHandler
().
handle
(
request
,
response
).
subscribe
(
new
Subscriber
<
Void
>()
{
@Override
public
void
onSubscribe
(
Subscription
subscription
)
{
subscription
.
request
(
Long
.
MAX_VALUE
);
}
@Override
public
void
onNext
(
Void
aVoid
)
{
// no op
}
@Override
public
void
onError
(
Throwable
ex
)
{
logger
.
error
(
"Could not complete request"
,
ex
);
if
(!
exchange
.
isResponseStarted
()
&&
exchange
.
getStatusCode
()
<=
500
)
{
exchange
.
setStatusCode
(
500
);
}
exchange
.
endExchange
();
}
@Override
public
void
onComplete
()
{
logger
.
debug
(
"Successfully completed request"
);
exchange
.
endExchange
();
}
});
HandlerResultSubscriber
resultSubscriber
=
new
HandlerResultSubscriber
(
exchange
);
getHttpHandler
().
handle
(
request
,
response
).
subscribe
(
resultSubscriber
);
}
private
class
HandlerResultSubscriber
implements
Subscriber
<
Void
>
{
private
final
HttpServerExchange
exchange
;
public
HandlerResultSubscriber
(
HttpServerExchange
exchange
)
{
this
.
exchange
=
exchange
;
}
@Override
public
void
onSubscribe
(
Subscription
subscription
)
{
subscription
.
request
(
Long
.
MAX_VALUE
);
}
@Override
public
void
onNext
(
Void
aVoid
)
{
// no op
}
@Override
public
void
onError
(
Throwable
ex
)
{
logger
.
error
(
"Could not complete request"
,
ex
);
if
(!
this
.
exchange
.
isResponseStarted
()
&&
this
.
exchange
.
getStatusCode
()
<
500
)
{
this
.
exchange
.
setStatusCode
(
500
);
}
this
.
exchange
.
endExchange
();
}
@Override
public
void
onComplete
()
{
logger
.
debug
(
"Successfully completed request"
);
this
.
exchange
.
endExchange
();
}
}
}
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java
浏览文件 @
70f14c14
...
...
@@ -52,17 +52,16 @@ public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
private
final
RequestBodyPublisher
body
;
public
UndertowServerHttpRequest
(
HttpServerExchange
exchange
,
DataBufferFactory
dataBufferFactory
)
{
public
UndertowServerHttpRequest
(
HttpServerExchange
exchange
,
DataBufferFactory
bufferFactory
)
{
super
(
initUri
(
exchange
),
initHeaders
(
exchange
));
this
.
exchange
=
exchange
;
this
.
body
=
new
RequestBodyPublisher
(
exchange
,
dataB
ufferFactory
);
this
.
body
.
registerListener
(
exchange
);
this
.
body
=
new
RequestBodyPublisher
(
exchange
,
b
ufferFactory
);
this
.
body
.
registerListener
s
(
exchange
);
}
private
static
URI
initUri
(
HttpServerExchange
exchange
)
{
Assert
.
notNull
(
exchange
,
"
'exchange'
is required."
);
Assert
.
notNull
(
exchange
,
"
HttpServerExchange
is required."
);
try
{
return
new
URI
(
exchange
.
getRequestScheme
(),
null
,
exchange
.
getHostName
(),
exchange
.
getHostPort
(),
...
...
@@ -110,35 +109,29 @@ public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
private
static
class
RequestBodyPublisher
extends
AbstractListenerReadPublisher
<
DataBuffer
>
{
private
final
ChannelListener
<
StreamSourceChannel
>
readListener
=
new
ReadListener
();
private
final
StreamSourceChannel
channel
;
private
final
ChannelListener
<
StreamSourceChannel
>
closeListener
=
new
CloseListener
();
private
final
StreamSourceChannel
requestChannel
;
private
final
DataBufferFactory
dataBufferFactory
;
private
final
DataBufferFactory
bufferFactory
;
private
final
ByteBufferPool
byteBufferPool
;
private
PooledByteBuffer
pooledByteBuffer
;
public
RequestBodyPublisher
(
HttpServerExchange
exchange
,
DataBufferFactory
dataBufferFactory
)
{
this
.
requestChannel
=
exchange
.
getRequestChannel
();
public
RequestBodyPublisher
(
HttpServerExchange
exchange
,
DataBufferFactory
bufferFactory
)
{
this
.
channel
=
exchange
.
getRequestChannel
();
this
.
bufferFactory
=
bufferFactory
;
this
.
byteBufferPool
=
exchange
.
getConnection
().
getByteBufferPool
();
this
.
dataBufferFactory
=
dataBufferFactory
;
}
private
void
registerListener
(
HttpServerExchange
exchange
)
{
private
void
registerListener
s
(
HttpServerExchange
exchange
)
{
exchange
.
addExchangeCompleteListener
((
ex
,
next
)
->
{
onAllDataRead
();
next
.
proceed
();
});
this
.
requestChannel
.
getReadSetter
().
set
(
this
.
readListener
);
this
.
requestChannel
.
getCloseSetter
().
set
(
this
.
closeListener
);
this
.
requestC
hannel
.
resumeReads
();
this
.
channel
.
getReadSetter
().
set
((
ChannelListener
<
StreamSourceChannel
>)
c
->
onDataAvailable
()
);
this
.
channel
.
getCloseSetter
().
set
((
ChannelListener
<
StreamSourceChannel
>)
c
->
onAllDataRead
()
);
this
.
c
hannel
.
resumeReads
();
}
@Override
...
...
@@ -152,14 +145,14 @@ public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
this
.
pooledByteBuffer
=
this
.
byteBufferPool
.
allocate
();
}
ByteBuffer
byteBuffer
=
this
.
pooledByteBuffer
.
getBuffer
();
int
read
=
this
.
requestC
hannel
.
read
(
byteBuffer
);
int
read
=
this
.
c
hannel
.
read
(
byteBuffer
);
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"read:"
+
read
);
}
if
(
read
>
0
)
{
byteBuffer
.
flip
();
return
this
.
dataB
ufferFactory
.
wrap
(
byteBuffer
);
return
this
.
b
ufferFactory
.
wrap
(
byteBuffer
);
}
else
if
(
read
==
-
1
)
{
onAllDataRead
();
...
...
@@ -174,21 +167,5 @@ public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
}
super
.
onAllDataRead
();
}
private
class
ReadListener
implements
ChannelListener
<
StreamSourceChannel
>
{
@Override
public
void
handleEvent
(
StreamSourceChannel
channel
)
{
onDataAvailable
();
}
}
private
class
CloseListener
implements
ChannelListener
<
StreamSourceChannel
>
{
@Override
public
void
handleEvent
(
StreamSourceChannel
channel
)
{
onAllDataRead
();
}
}
}
}
spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java
浏览文件 @
70f14c14
...
...
@@ -141,22 +141,20 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
private
static
class
ResponseBodyProcessor
extends
AbstractListenerWriteProcessor
<
DataBuffer
>
{
private
final
ChannelListener
<
StreamSinkChannel
>
listener
=
new
WriteListener
();
private
final
StreamSinkChannel
responseChannel
;
private
final
StreamSinkChannel
channel
;
private
volatile
ByteBuffer
byteBuffer
;
public
ResponseBodyProcessor
(
StreamSinkChannel
responseC
hannel
)
{
Assert
.
notNull
(
responseChannel
,
"'responseChannel'
must not be null"
);
this
.
responseChannel
=
responseC
hannel
;
public
ResponseBodyProcessor
(
StreamSinkChannel
c
hannel
)
{
Assert
.
notNull
(
channel
,
"StreamSinkChannel
must not be null"
);
this
.
channel
=
c
hannel
;
}
public
void
registerListener
()
{
this
.
responseChannel
.
getWriteSetter
().
set
(
this
.
listener
);
this
.
responseC
hannel
.
resumeWrites
();
this
.
channel
.
getWriteSetter
().
set
((
ChannelListener
<
StreamSinkChannel
>)
c
->
onWritePossible
()
);
this
.
c
hannel
.
resumeWrites
();
}
@Override
...
...
@@ -180,7 +178,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
int
written
;
int
totalWritten
=
0
;
do
{
written
=
this
.
responseC
hannel
.
write
(
byteBuffer
);
written
=
this
.
c
hannel
.
write
(
byteBuffer
);
totalWritten
+=
written
;
}
while
(
byteBuffer
.
hasRemaining
()
&&
written
>
0
);
...
...
@@ -208,14 +206,6 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
protected
boolean
isDataEmpty
(
DataBuffer
dataBuffer
)
{
return
dataBuffer
.
readableByteCount
()
==
0
;
}
private
class
WriteListener
implements
ChannelListener
<
StreamSinkChannel
>
{
@Override
public
void
handleEvent
(
StreamSinkChannel
channel
)
{
onWritePossible
();
}
}
}
private
class
ResponseBodyFlushProcessor
extends
AbstractListenerFlushProcessor
<
DataBuffer
>
{
...
...
spring-web/src/test/java/org/springframework/http/server/reactive/bootstrap/UndertowHttpServer.java
浏览文件 @
70f14c14
...
...
@@ -17,7 +17,6 @@
package
org.springframework.http.server.reactive.bootstrap
;
import
io.undertow.Undertow
;
import
io.undertow.server.HttpHandler
;
import
org.springframework.http.server.reactive.UndertowHttpHandlerAdapter
;
import
org.springframework.util.Assert
;
...
...
@@ -34,10 +33,19 @@ public class UndertowHttpServer extends HttpServerSupport implements HttpServer
@Override
public
void
afterPropertiesSet
()
throws
Exception
{
Assert
.
notNull
(
getHttpHandler
());
HttpHandler
handler
=
new
UndertowHttpHandlerAdapter
(
getHttpHandler
());
this
.
server
=
Undertow
.
builder
().
addHttpListener
(
getPort
(),
getHost
())
.
setHandler
(
handler
).
build
();
.
setHandler
(
initUndertowHttpHandlerAdapter
())
.
build
();
}
private
UndertowHttpHandlerAdapter
initUndertowHttpHandlerAdapter
()
{
if
(
getHttpHandlerMap
()
!=
null
)
{
return
new
UndertowHttpHandlerAdapter
(
getHttpHandlerMap
());
}
else
{
Assert
.
notNull
(
getHttpHandler
());
return
new
UndertowHttpHandlerAdapter
(
getHttpHandler
());
}
}
@Override
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录