谢谢 JB Nizet(没有快速回复,因为我必须等待 8 小时才能回复 -> 我是 StackOverflow 的新手,需要声誉)
我已经测试使用新的 SLB 发送 JMS 消息,结果相同,但我的两个 SLB 强耦合,因为我将 TopicPublisher 和 JMS 消息传递给我的新测试 EJB。
我刚刚测试了在我的测试 EJB 中创建 TopicPublisher 和消息,并且......它的工作!
这是我的新 EJB:
package boursorama.stateless;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
@Stateless
@LocalBean
public class Test {
@Resource(mappedName="jms/boursoramaTopicFactory")
TopicConnectionFactory topicConnectionFactory;
@Resource(mappedName="jms/boursoramaTopicDestination")
Topic topic;
private TopicConnection _topicConnection;
private TopicSession _topicSession;
private TopicPublisher _topicPublisher;
@PostConstruct
public void postConstruct(){
try {
_topicConnection = topicConnectionFactory.createTopicConnection();
_topicSession = _topicConnection.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
_topicPublisher = _topicSession.createPublisher(topic);
} catch (JMSException e) {
e.printStackTrace();
}
}
@PreDestroy
public void preDestroy(){
try {
_topicConnection.close();
_topicConnection = null;
} catch (JMSException e) {
e.printStackTrace();
}
}
public Test() {
// TODO Auto-generated constructor stub
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void test(){
try {
Message m = _topicSession.createObjectMessage();
_topicPublisher.send(m);
} catch (JMSException e) {
e.printStackTrace();
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void test2(TopicPublisher to, Message m){
try {
to.send(m);
} catch (JMSException e) {
e.printStackTrace();
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void test3(Message m){
try {
_topicPublisher.send(m);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
当我调用 test() 或 test3() 时,我异步接收所有消息,但 test2() 一起发送消息。
如果我理解得很好,当方法之间共享某些资源(使用@Resource)时,我们无法在同一个 EJB 内部或外部管理事务(使用 REQUIRES_NEW)?我肯定有这种行为来尊重事务隔离吗?
再次感谢你
奥利维尔