这个问题只是为了我的学术目的。如有任何回复,我们将不胜感激。
假设我有一个MDB与EJB TransactionAttribute.NOT_SUPPORTED.
@TransactionManagement(TransactionManagementType.BEAN)
@MessageDriven(name = "NonPersistentInquiryMessageBean", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
public class InvoiceInquiryMessageBean implements MessageListener
{
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void onMessage(Message msg) {
//calls a SSB-1 as defined below
//SSB-1.method1()
}
}
@Stateless
public class SSB-1 implements SSB-1Local
{
public void method1(){
}
# 1问题。当我为onMessage()指定NOT_SUPPORTED时,容器执行onMessage()而不执行任何事务。当从onMessage()调用SSB-1.method1()时,容器是否仍然执行没有任何事务的SSB-1.method1() ?(根据其定义)
问题# 2 如果我想要SSB-1。Method1在没有事务的情况下执行,我应该明确提到在bean或method1()级别上不支持SSB-1 ?或者让它保持原样,因为调用OnMessage()已经被声明为NOT_SUPPORTED
问题# 3 假设ssss -1.method1()正在调用另一个我需要管理事务的SSB-2,下面的定义是否有效?
@Stateless
public class SSB-1 implements SSB-1Local
{
public void method1(){
//call SSB-2.somemethod();
}
@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class SSB-2
{
@Resource
private UserTransaction userTransaction;
public void somemethod(){
userTransaction.begin();
//biz logic
userTransaction.commit()
}
[您需要查看命名约定,这可能是为了演示,但仍然可以发布更好的命名约定]
问题# 1 。如指定NOT_SUPPORTED为onMessage(),容器在没有任何事务的情况下执行onMessage()。当SSB-1.method1()从onMessage()调用,将容器仍然执行SSB-1.method1()没有任何事务?(按定义)
不,这取决于SSB-1.method1()
的事务属性,如果没有指定,则默认为Required
&由于onMessage()
没有任何正在进行的事务,因此将启动新的事务。
问题#2如果我想要SSB-1。如果SSB-1明确提到NOT_SUPPORTED,则可以在没有事务的情况下执行method1在bean还是method1()级别?或者让它保持原样调用OnMessage()已经被声明为NOT_SUPPORTED
需要明确提及SSB-1.method1()
,与#1解释相同。最好是在方法级别,而不是在其他类方法上强制执行。
问题#3假设ssss -1.method1()正在调用另一个SSB-2,我需要为其管理事务,将定义如下工作。
CMT bean可以接受由CMT发起的交易;BMT,但反过来不是真的。BMT将暂停交易&总是自己创造新的东西。根据您的示例代码,它将不起作用,SSB-1
是CMT,而SSB-2
是BMT。