2017-06-16 21 views
1

Java EEでMessage-Driven Beanを使用してパイプとフィルタパターンを実装しようとしていますが、キューを構成可能にしてBeanを実行時に作成されます。このようにして、フィルタの実行順序を変更するのは簡単です。Java EEでMDBを使用したパイプとフィルタパターン

私は、Java EEには本当に新しいだと私は過去にMDBを使用したとき、私はいつもこのようにそれをやった:

@MessageDriven(mappedName = "jms/myQueue", activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") 
}) 
public class ReceiveMessageBean implements MessageListener { 

これは私が欲しいもののために動作しません。

私は、このような何かのフィルタのそれぞれは継承でき豆、私は読み取りを入れて、一つだけの場所でキューメソッドから書くことができ、そのようにやって考えていた

public class StepBean { 
    public void createBean(String queueRead, String queueWrite) { 
     //make the bean listen from queueRead 
     //make the bean write to queueWrite 
    } 
    public void onMessage(Message message){ 
     //get the message from queueRead and transform it to my own class 
     processMessage(myMessage); 
    } 

    public void processMessage(MyMessage message){ 
     //each filter should implement this method 
     sendMessage(myMessage); 
    } 

    public void sendMessage(MyMessage message){ 
     //send message to queueWrite 
    } 
} 

をと私のejbに何らかの種類のファクトリを持っていて、キューの望ましい値を持つステップBeanを作成します。

しかし、私はかなりこれを行う方法を失っています。私はthisを見てきましたが、私の豆はキューから読み書きするので、厳密にMDBではありません。

私はGlassFish 4.1.2とNetbeans 8.2を使用しています。

これを行う方法やそれが可能かどうかについてのご案内は大歓迎です。

答えて

0

MDBをサーバーによって管理する必要があるため、プログラムで作成することはできません。ダイナミックリスナーを作成する場合は、MessageConsumersetMessageListenerを使用します。設定に応じて、接続ファクトリからConnectionにアクセスし、セッション、コンシューマ、最後にメッセージリスナを作成する必要があります。消費者は、メッセージセレクタ=あなたのフィルタで作成することができます。短い例:

ConnectionFactory conFactory = (ConnectionFactory) ic.lookup("java:/ConnectionFactory");//customize the jndi to match your server 
Connection connection = conFactory.createConnection(); 
Queue myqueue = ic.lookup("java:/jms/queue/MyQueue"); 
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
String messageSelector = "MY_MSG_PROPERTY = 'MY_FILTER_VALUE'"; 
Consumer consumer = session.createConsumer(myqueue, messageSelector); 

consumer.setMessageListener(new MessageListener() { 
    @Override 
    public void onMessage(Message message) { 
     //handle you message here 
    } 
}); 

この方法では、異なるフィルタと異なるメッセージリスナを持つ複数のコンシューマを作成できます。しかし、これらのリスナーはコンテナ管理されていないので、リスナーが必要なくなった場合(セッションを閉じるなど)、リソースのクリーンアップ/クローズを処理する必要があることに注意してください。

+0

これはうまくいきましたが、私は 'Consumer'の代わりに' MessageConsumer'を使いました – moondaisy