这个问题仅供我的学术目的使用。任何回复都将受到高度赞赏
假设我有一个带有EJB TransactionAttribute.NOT_SUPPORTED的MDB。
@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 NOT_SUPPORTED?或者只是保持原样,因为调用OnMessage()已经被声明为NOT_SUPPORTED
问题#3 假设SSS-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()
}
答案 0 :(得分:1)
[您需要查看命名约定,它可能是为了演示,但仍然可以发布更好的]
问题#1 。我为onMessage(),容器指定了NOT_SUPPORTED 在没有任何事务的情况下执行onMessage()。当。。。的时候 从onMessage()调用SSB-1.method1(),容器仍然是 执行SSB-1.method1()没有任何交易?(根据它的 定义)
不,这取决于SSB-1.method1()
的交易属性,如果没有指定,则默认为Required
&由于onMessage()
没有任何正在进行的交易,因此将启动新交易。
问题#2 如果我希望SSB-1.method1在没有事务的情况下执行,我应该明确提到SSB-1的NOT_SUPPORTED 在bean或method1()级别?或者只是保持原样 调用OnMessage()已经声明为NOT_SUPPORTED
需要明确提及SSB-1.method1()
,与#1相同的解释。最好在方法级别上不对其他类方法强制执行。
问题#3 假设SSS-1.method1()正在调用我需要管理事务的另一个SSB-2,请将下面的定义 工作
CMT bean可以接受CMT发起的交易。 BMT,但反过来并非如此。 BMT将暂停交易&总是自己创造新的。根据您的示例代码,它无法正常工作,SSB-1
是CMT而SSB-2
是BMT。