1

アプリケーションに理解できない動作があります。ステートフルBeanが1つ、ステートレスBeanが1つあり、SLBのSFB 1メソッド(WEBページの解析)から呼び出したい。大丈夫ですが、SLBはJMSメッセージを別のアプリケーションに送信するビジネスメソッドを呼び出し、トランザクションタイプ(必須)のためにすべてのメッセージが同時に受信されます。

そのため、sendindメソッドのトランザクションタイプをREQUIRES_NEWに変更しましたが、同じであり、すべてのメッセージが同時に受信されます。

解析方法をREQUIRES_NEWに変更することで、メッセージを非同期で受信します。では、この動作はどのように説明できますか?

要約する :

SFB method -> REQUIRED

SLB method (parsing of WEB page, urls stored in String[]) -> REQUIRED

SLB method JMS -> REQUIRED

==> JMS messages are received synchronously



SFB method -> REQUIRED

SLB method -> REQUIRED

SLB method JMS -> REQUIRES_NEW

==> JMS messages are received synchronously



SFB method -> REQUIRED

SLB method -> REQUIRES_NEW

SLB method JMS -> REQUIRES_NEW

==> JMS messages are received asynchronously

ケース2でJMSメッセージを非同期に送信することを期待していました...

説明してくれてありがとう

オリヴィエ

4

2 に答える 2

3

コードは表示されませんが、同じSLBインスタンスのparseメソッドからSLBのsendメソッドを呼び出していると思われます。その場合、メソッド呼び出しは直接メソッド呼び出しであり、Beanプロキシを経由しないため、sendメソッドのトランザクションアノテーションは完全に無視されます。

あなたが持っている

SFB -> transactional proxy -> SLB -> SLB

あなたが持っているべき場所

SFB -> transactional proxy -> SLB -> transactional proxy -> SLB

最も簡単な方法は、sendメソッドを別のSLBに配置することです。

于 2012-09-13T09:07:31.897 に答える
0

ありがとう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を使用)を管理できませんか?確かに、トランザクション分離を尊重するためにこの動作がありますか?

ありがとうございました

オリヴィエ

于 2012-09-13T21:15:52.027 に答える