2017-06-16 3 views
1

J'essaye d'implémenter le modèle de tuyaux et filtres avec les beans Message-Driven dans Java EE, mais je veux le faire de manière à ce que les files d'attente soient configurables et les haricots créé lors de l'exécution. De cette façon changer l'ordre dans lequel les filtres s'exécutent serait facile.Modèle de tuyaux et de filtres avec MDB en Java EE

Je suis vraiment nouveau pour Java EE et quand je MDB dans le passé, je le faisais toujours comme ça:

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

Cela ne fonctionnera pas pour ce que je veux.

Je pensais faire un haricot que chacun des filtres pourrait hériter de, de cette façon, je peux mettre la lecture et d'écriture de la méthode de file d'attente dans un seul endroit, quelque chose comme ceci:

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 
    } 
} 

Et puis avoir une sorte d'usine dans mon ejb qui crée les haricots étape avec les valeurs souhaitées pour les files d'attente.

Mais je suis assez perdu sur la façon de faire tout cela. J'ai regardé this, mais puisque mes beans lisent et écrivent des files d'attente elles ne sont pas strictement MDB. Je utilise GlassFish 4.1.2 et Netbeans 8.2.

Tout conseil sur la façon de procéder ou sur la possibilité de le faire est le bienvenu.

Répondre

0

Vous ne pouvez pas créer de MDB par programme car ils doivent être gérés par le serveur. Si vous souhaitez créer des écouteurs dynamiques, utilisez les codes MessageConsumer et setMessageListener. En fonction de votre configuration, vous devez accéder à Connection à partir d'une fabrique de connexions, puis créer un écouteur de session, consommateur et enfin message. Un consommateur peut être créé avec le sélecteur de message = votre filtre. Un exemple court:

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 
    } 
}); 

Avec cette approche, vous pouvez créer plusieurs consommateurs avec différents filtres et différents écouteurs de message. Mais gardez à l'esprit que ces écouteurs ne sont pas gérés par un conteneur, et vous devez vous occuper du nettoyage des ressources/fermer si vous n'avez plus besoin de ces écouteurs (fermez la session, etc.).

+0

Cela a fonctionné, mais j'ai utilisé un 'MessageConsumer' au lieu d'un' Consumer' – moondaisy