Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
00ed8da5
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,发现更多精彩内容 >>
提交
00ed8da5
编写于
2月 26, 2019
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
JmsTransactionManager supports lazy resource retrieval
Closes gh-22468
上级
8d9ef46d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
254 addition
and
101 deletion
+254
-101
spring-jms/src/main/java/org/springframework/jms/connection/JmsResourceHolder.java
...org/springframework/jms/connection/JmsResourceHolder.java
+72
-12
spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager.java
...springframework/jms/connection/JmsTransactionManager.java
+109
-9
spring-jms/src/test/java/org/springframework/jms/connection/JmsTransactionManagerTests.java
...gframework/jms/connection/JmsTransactionManagerTests.java
+73
-80
未找到文件。
spring-jms/src/main/java/org/springframework/jms/connection/JmsResourceHolder.java
浏览文件 @
00ed8da5
/*
* Copyright 2002-201
8
the original author or authors.
* Copyright 2002-201
9
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.
...
...
@@ -19,7 +19,6 @@ package org.springframework.jms.connection;
import
java.lang.reflect.Method
;
import
java.util.HashMap
;
import
java.util.LinkedList
;
import
java.util.List
;
import
java.util.Map
;
import
javax.jms.Connection
;
import
javax.jms.ConnectionFactory
;
...
...
@@ -58,11 +57,11 @@ public class JmsResourceHolder extends ResourceHolderSupport {
private
boolean
frozen
=
false
;
private
final
List
<
Connection
>
connections
=
new
LinkedList
<>();
private
final
Li
nkedLi
st
<
Connection
>
connections
=
new
LinkedList
<>();
private
final
List
<
Session
>
sessions
=
new
LinkedList
<>();
private
final
Li
nkedLi
st
<
Session
>
sessions
=
new
LinkedList
<>();
private
final
Map
<
Connection
,
List
<
Session
>>
sessionsPerConnection
=
new
HashMap
<>();
private
final
Map
<
Connection
,
Li
nkedLi
st
<
Session
>>
sessionsPerConnection
=
new
HashMap
<>();
/**
...
...
@@ -117,10 +116,19 @@ public class JmsResourceHolder extends ResourceHolderSupport {
}
/**
* Return whether this resource holder is frozen, i.e. does not
* allow for adding further Connections and Sessions to it.
* @see #addConnection
* @see #addSession
*/
public
final
boolean
isFrozen
()
{
return
this
.
frozen
;
}
/**
* Add the given Connection to this resource holder.
*/
public
final
void
addConnection
(
Connection
connection
)
{
Assert
.
isTrue
(!
this
.
frozen
,
"Cannot add Connection because JmsResourceHolder is frozen"
);
Assert
.
notNull
(
connection
,
"Connection must not be null"
);
...
...
@@ -129,54 +137,102 @@ public class JmsResourceHolder extends ResourceHolderSupport {
}
}
/**
* Add the given Session to this resource holder.
*/
public
final
void
addSession
(
Session
session
)
{
addSession
(
session
,
null
);
}
/**
* Add the given Session to this resource holder,
* registered for a specific Connection.
*/
public
final
void
addSession
(
Session
session
,
@Nullable
Connection
connection
)
{
Assert
.
isTrue
(!
this
.
frozen
,
"Cannot add Session because JmsResourceHolder is frozen"
);
Assert
.
notNull
(
session
,
"Session must not be null"
);
if
(!
this
.
sessions
.
contains
(
session
))
{
this
.
sessions
.
add
(
session
);
if
(
connection
!=
null
)
{
List
<
Session
>
sessions
=
this
.
sessionsPerConnection
.
computeIfAbsent
(
connection
,
k
->
new
LinkedList
<>());
LinkedList
<
Session
>
sessions
=
this
.
sessionsPerConnection
.
computeIfAbsent
(
connection
,
k
->
new
LinkedList
<>());
sessions
.
add
(
session
);
}
}
}
/**
* Determine whether the given Session is registered
* with this resource holder.
*/
public
boolean
containsSession
(
Session
session
)
{
return
this
.
sessions
.
contains
(
session
);
}
/**
* Return this resource holder's default Connection,
* or {@code null} if none.
*/
@Nullable
public
Connection
getConnection
()
{
return
(!
this
.
connections
.
isEmpty
()
?
this
.
connections
.
get
(
0
)
:
null
);
return
this
.
connections
.
peek
(
);
}
/**
* Return this resource holder's Connection of the given type,
* or {@code null} if none.
*/
@Nullable
public
Connection
getConnection
(
Class
<?
extends
Connection
>
connectionType
)
{
public
<
C
extends
Connection
>
C
getConnection
(
Class
<
C
>
connectionType
)
{
return
CollectionUtils
.
findValueOfType
(
this
.
connections
,
connectionType
);
}
/**
* Return an existing original Session, if any.
* <p>In contrast to {@link #getSession()}, this must not lazily initialize
* a new Session, not even in {@link JmsResourceHolder} subclasses.
*/
@Nullable
Session
getOriginalSession
()
{
return
this
.
sessions
.
peek
();
}
/**
* Return this resource holder's default Session,
* or {@code null} if none.
*/
@Nullable
public
Session
getSession
()
{
return
(!
this
.
sessions
.
isEmpty
()
?
this
.
sessions
.
get
(
0
)
:
null
);
return
this
.
sessions
.
peek
(
);
}
/**
* Return this resource holder's Session of the given type,
* or {@code null} if none.
*/
@Nullable
public
Session
getSession
(
Class
<?
extends
Session
>
sessionType
)
{
public
<
S
extends
Session
>
S
getSession
(
Class
<
S
>
sessionType
)
{
return
getSession
(
sessionType
,
null
);
}
/**
* Return this resource holder's Session of the given type
* for the given connection, or {@code null} if none.
*/
@Nullable
public
Session
getSession
(
Class
<?
extends
Session
>
sessionType
,
@Nullable
Connection
connection
)
{
List
<
Session
>
sessions
=
(
connection
!=
null
?
this
.
sessionsPerConnection
.
get
(
connection
)
:
this
.
sessions
);
public
<
S
extends
Session
>
S
getSession
(
Class
<
S
>
sessionType
,
@Nullable
Connection
connection
)
{
LinkedList
<
Session
>
sessions
=
(
connection
!=
null
?
this
.
sessionsPerConnection
.
get
(
connection
)
:
this
.
sessions
);
return
CollectionUtils
.
findValueOfType
(
sessions
,
sessionType
);
}
/**
* Commit all of this resource holder's Sessions.
* @throws JMSException if thrown from a Session commit attempt
* @see Session#commit()
*/
public
void
commitAll
()
throws
JMSException
{
for
(
Session
session
:
this
.
sessions
)
{
try
{
...
...
@@ -218,6 +274,10 @@ public class JmsResourceHolder extends ResourceHolderSupport {
}
}
/**
* Close all of this resource holder's Sessions and clear its state.
* @see Session#close()
*/
public
void
closeAll
()
{
for
(
Session
session
:
this
.
sessions
)
{
try
{
...
...
spring-jms/src/main/java/org/springframework/jms/connection/JmsTransactionManager.java
浏览文件 @
00ed8da5
/*
* Copyright 2002-201
7
the original author or authors.
* Copyright 2002-201
9
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.
...
...
@@ -96,6 +96,8 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
@Nullable
private
ConnectionFactory
connectionFactory
;
private
boolean
lazyResourceRetrieval
=
false
;
/**
* Create a new JmsTransactionManager for bean-style usage.
...
...
@@ -128,7 +130,7 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
* Set the JMS ConnectionFactory that this instance should manage transactions for.
*/
public
void
setConnectionFactory
(
@Nullable
ConnectionFactory
cf
)
{
if
(
cf
!=
null
&&
cf
instanceof
TransactionAwareConnectionFactoryProxy
)
{
if
(
cf
instanceof
TransactionAwareConnectionFactoryProxy
)
{
// If we got a TransactionAwareConnectionFactoryProxy, we need to perform transactions
// for its underlying target ConnectionFactory, else JMS access code won't see
// properly exposed transactions (i.e. transactions for the target ConnectionFactory).
...
...
@@ -159,6 +161,19 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
return
connectionFactory
;
}
/**
* Specify whether this transaction manager should lazily retrieve a JMS
* Connection and Session on access within a transaction ({@code true}).
* By default, it will eagerly create a JMS Connection and Session at
* transaction begin ({@code false}).
* @since 5.1.6
* @see JmsResourceHolder#getConnection()
* @see JmsResourceHolder#getSession()
*/
public
void
setLazyResourceRetrieval
(
boolean
lazyResourceRetrieval
)
{
this
.
lazyResourceRetrieval
=
lazyResourceRetrieval
;
}
/**
* Make sure the ConnectionFactory has been set.
*/
...
...
@@ -200,12 +215,18 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
Connection
con
=
null
;
Session
session
=
null
;
try
{
con
=
createConnection
();
session
=
createSession
(
con
);
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"Created JMS transaction on Session ["
+
session
+
"] from Connection ["
+
con
+
"]"
);
JmsResourceHolder
resourceHolder
;
if
(
this
.
lazyResourceRetrieval
)
{
resourceHolder
=
new
LazyJmsResourceHolder
(
connectionFactory
);
}
else
{
con
=
createConnection
();
session
=
createSession
(
con
);
if
(
logger
.
isDebugEnabled
())
{
logger
.
debug
(
"Created JMS transaction on Session ["
+
session
+
"] from Connection ["
+
con
+
"]"
);
}
resourceHolder
=
new
JmsResourceHolder
(
connectionFactory
,
con
,
session
);
}
JmsResourceHolder
resourceHolder
=
new
JmsResourceHolder
(
connectionFactory
,
con
,
session
);
resourceHolder
.
setSynchronizedWithTransaction
(
true
);
int
timeout
=
determineTimeout
(
definition
);
if
(
timeout
!=
TransactionDefinition
.
TIMEOUT_DEFAULT
)
{
...
...
@@ -250,7 +271,7 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
@Override
protected
void
doCommit
(
DefaultTransactionStatus
status
)
{
JmsTransactionObject
txObject
=
(
JmsTransactionObject
)
status
.
getTransaction
();
Session
session
=
txObject
.
getResourceHolder
().
getSession
();
Session
session
=
txObject
.
getResourceHolder
().
get
Original
Session
();
if
(
session
!=
null
)
{
try
{
if
(
status
.
isDebug
())
{
...
...
@@ -270,7 +291,7 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
@Override
protected
void
doRollback
(
DefaultTransactionStatus
status
)
{
JmsTransactionObject
txObject
=
(
JmsTransactionObject
)
status
.
getTransaction
();
Session
session
=
txObject
.
getResourceHolder
().
getSession
();
Session
session
=
txObject
.
getResourceHolder
().
get
Original
Session
();
if
(
session
!=
null
)
{
try
{
if
(
status
.
isDebug
())
{
...
...
@@ -321,6 +342,85 @@ public class JmsTransactionManager extends AbstractPlatformTransactionManager
}
/**
* Lazily initializing variant of {@link JmsResourceHolder},
* initializing a JMS Connection and Session on user access.
*/
private
class
LazyJmsResourceHolder
extends
JmsResourceHolder
{
private
boolean
connectionInitialized
=
false
;
private
boolean
sessionInitialized
=
false
;
public
LazyJmsResourceHolder
(
@Nullable
ConnectionFactory
connectionFactory
)
{
super
(
connectionFactory
);
}
@Override
@Nullable
public
Connection
getConnection
()
{
initializeConnection
();
return
super
.
getConnection
();
}
@Override
@Nullable
public
<
C
extends
Connection
>
C
getConnection
(
Class
<
C
>
connectionType
)
{
initializeConnection
();
return
super
.
getConnection
(
connectionType
);
}
@Override
@Nullable
public
Session
getSession
()
{
initializeSession
();
return
super
.
getSession
();
}
@Override
@Nullable
public
<
S
extends
Session
>
S
getSession
(
Class
<
S
>
sessionType
)
{
initializeSession
();
return
super
.
getSession
(
sessionType
);
}
@Override
@Nullable
public
<
S
extends
Session
>
S
getSession
(
Class
<
S
>
sessionType
,
@Nullable
Connection
connection
)
{
initializeSession
();
return
super
.
getSession
(
sessionType
,
connection
);
}
private
void
initializeConnection
()
{
if
(!
this
.
connectionInitialized
)
{
try
{
addConnection
(
createConnection
());
}
catch
(
JMSException
ex
)
{
throw
new
CannotCreateTransactionException
(
"Failed to lazily initialize JMS Connection for transaction"
,
ex
);
}
this
.
connectionInitialized
=
true
;
}
}
private
void
initializeSession
()
{
if
(!
this
.
sessionInitialized
)
{
Connection
con
=
getConnection
();
Assert
.
state
(
con
!=
null
,
"No transactional JMS Connection"
);
try
{
addSession
(
createSession
(
con
),
con
);
}
catch
(
JMSException
ex
)
{
throw
new
CannotCreateTransactionException
(
"Failed to lazily initialize JMS Session for transaction"
,
ex
);
}
this
.
sessionInitialized
=
true
;
}
}
}
/**
* JMS transaction object, representing a JmsResourceHolder.
* Used as transaction object by JmsTransactionManager.
...
...
spring-jms/src/test/java/org/springframework/jms/connection/JmsTransactionManagerTests.java
浏览文件 @
00ed8da5
/*
* Copyright 2002-201
8
the original author or authors.
* Copyright 2002-201
9
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.
...
...
@@ -29,7 +29,6 @@ import org.junit.Test;
import
org.springframework.jms.StubQueue
;
import
org.springframework.jms.core.JmsTemplate
;
import
org.springframework.jms.core.MessageCreator
;
import
org.springframework.jms.core.SessionCallback
;
import
org.springframework.transaction.TransactionDefinition
;
import
org.springframework.transaction.TransactionStatus
;
...
...
@@ -67,12 +66,9 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
tm
.
commit
(
ts
);
...
...
@@ -93,12 +89,9 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
tm
.
rollback
(
ts
);
...
...
@@ -119,23 +112,17 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
final
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
TransactionTemplate
tt
=
new
TransactionTemplate
(
tm
);
tt
.
execute
(
new
TransactionCallbackWithoutResult
()
{
@Override
protected
void
doInTransactionWithoutResult
(
TransactionStatus
status
)
{
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
}
});
...
...
@@ -158,23 +145,17 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
final
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
TransactionTemplate
tt
=
new
TransactionTemplate
(
tm
);
tt
.
execute
(
new
TransactionCallbackWithoutResult
()
{
@Override
protected
void
doInTransactionWithoutResult
(
TransactionStatus
status
)
{
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
status
.
setRollbackOnly
();
}
...
...
@@ -206,33 +187,24 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
final
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
TransactionTemplate
tt
=
new
TransactionTemplate
(
tm
);
tt
.
setPropagationBehavior
(
TransactionDefinition
.
PROPAGATION_NOT_SUPPORTED
);
tt
.
execute
(
new
TransactionCallbackWithoutResult
()
{
@Override
protected
void
doInTransactionWithoutResult
(
TransactionStatus
status
)
{
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
!=
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertNotSame
(
sess
,
session
);
return
null
;
});
}
});
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
tm
.
commit
(
ts
);
...
...
@@ -255,33 +227,24 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
final
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
TransactionTemplate
tt
=
new
TransactionTemplate
(
tm
);
tt
.
setPropagationBehavior
(
TransactionDefinition
.
PROPAGATION_REQUIRES_NEW
);
tt
.
execute
(
new
TransactionCallbackWithoutResult
()
{
@Override
protected
void
doInTransactionWithoutResult
(
TransactionStatus
status
)
{
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
!=
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertNotSame
(
sess
,
session
);
return
null
;
});
}
});
jt
.
execute
(
new
SessionCallback
<
Void
>()
{
@Override
public
Void
doInJms
(
Session
sess
)
{
assertTrue
(
sess
==
session
);
return
null
;
}
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
tm
.
commit
(
ts
);
...
...
@@ -310,12 +273,7 @@ public class JmsTransactionManagerTests {
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
send
(
dest
,
new
MessageCreator
()
{
@Override
public
Message
createMessage
(
Session
session
)
throws
JMSException
{
return
message
;
}
});
jt
.
send
(
dest
,
sess
->
message
);
tm
.
commit
(
ts
);
verify
(
producer
).
send
(
message
);
...
...
@@ -325,4 +283,39 @@ public class JmsTransactionManagerTests {
verify
(
con
).
close
();
}
@Test
public
void
testLazyTransactionalSession
()
throws
JMSException
{
ConnectionFactory
cf
=
mock
(
ConnectionFactory
.
class
);
Connection
con
=
mock
(
Connection
.
class
);
final
Session
session
=
mock
(
Session
.
class
);
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
tm
.
setLazyResourceRetrieval
(
true
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
given
(
cf
.
createConnection
()).
willReturn
(
con
);
given
(
con
.
createSession
(
true
,
Session
.
AUTO_ACKNOWLEDGE
)).
willReturn
(
session
);
JmsTemplate
jt
=
new
JmsTemplate
(
cf
);
jt
.
execute
((
SessionCallback
<
Void
>)
sess
->
{
assertSame
(
sess
,
session
);
return
null
;
});
tm
.
commit
(
ts
);
verify
(
session
).
commit
();
verify
(
session
).
close
();
verify
(
con
).
close
();
}
@Test
public
void
testLazyWithoutSessionAccess
()
{
ConnectionFactory
cf
=
mock
(
ConnectionFactory
.
class
);
JmsTransactionManager
tm
=
new
JmsTransactionManager
(
cf
);
tm
.
setLazyResourceRetrieval
(
true
);
TransactionStatus
ts
=
tm
.
getTransaction
(
new
DefaultTransactionDefinition
());
tm
.
commit
(
ts
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录