ありがとうJBNizet(返信する前に8時間待たなければならないので、すぐに返信しませんでした-> StackOverflowを初めて使用するので、評判が必要です)
新しいSLBを使用してJMSメッセージの送信をすでにテストしましたが、同じ結果でしたが、TopicPublisherとJMSメッセージを新しいテストEJBに渡したため、2つのSLBは強力に結合されました。
テスト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を使用)を管理できませんか?確かに、トランザクション分離を尊重するためにこの動作がありますか?
ありがとうございました
オリヴィエ