2008-11-04 6 views
2

Ma question est de savoir comment configurer un bean géré par un message de style EJB 3.0 pour utiliser une source de données JMS configurée dans jboss.Bean géré par message avec une source de données

Par exemple, mon MDB ressemble à quelque chose comme:

@MessageDriven(mappedName = "ExampleMDB", activationConfig = { 

     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), 
     @ActivationConfigProperty(propertyName = "destination", propertyValue = "MyTopic"), 
     @ActivationConfigProperty(propertyName = "channel", propertyValue = "MyChannel"), 

}) 
@ResourceAdapter(value = "wmq.jmsra.rar") 
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
@TransactionManagement(TransactionManagementType.BEAN) 
public class MyMDB implements MessageListener { 
..... 
} 

mais je voudrais la fève attachée à une source de données JMS donné (dans le cas de jboss 4.2.2 c'est dans deploy/jms/jms -ds.xml). Peut-être que ce n'est même pas possible mais cela vaut la peine de demander.

+0

Voulez-vous dire que vous voulez manipuler une source de données de la méthode onMessage()? – johnstok

Répondre

1

Si je comprends bien votre problème correctement, MyMDB écoute un sujet sur WebLogic, et que vous souhaitez utiliser une destination JMS supplémentaire fournie par JBoss, définie dans un fichier de configuration déployée et identifiée par son nom JNDI (par défaut, deploy/jms/jms-ds.xml seulement contient la configuration pour le fournisseur JMS et les fabriques de connexions - pas de sources de données). Le moyen le plus simple est de laisser le conteneur injecter la destination JMS et une fabrique de connexions via son nom JNDI (dans JBoss, les destinations JMS sont configurées par deploying xxx-service.xml files). Au démarrage, vous pouvez ensuite initialiser la connexion et effectuer le nettoyage dès que la MDB est libérée. Les exemples suivants représentent l'injection (@Resource) et la gestion des ressources (@PostConstruct et @PreDestroy). La connexion et la destination JMS sont utilisées dans useJmsDestination(String) pour envoyer un message texte.

public class MyMDB implements MessageListener { 

    @Resource(mappedName = "queue/YourQueueName") // can be topic too 
    private Queue targetDestination; 

    @Resource(mappedName = "QueueConnectionFactory") // or ConnectionFactory 
    private QueueConnectionFactory factory; 

    private Connection conn; 

    public void onMessage(Message m) { 
     // parse message and do what you need to do 
     ... 
     // do something with the message and the JBoss JMS destination 
     useJmsDestination(messageString);  
    } 

    private void useJmsDestination(String text) { 
     Session session = null; 
     MessageProducer producer = null; 

     try { 
      session = conn.createSession(true, Session.AUTO_ACKNOWLEDGE); 
      producer = session.createProducer(targetDestination); 
      TextMessage msg = session.createTextMessage(text); 
      producer.send(msg); 
     } catch (JMSException e) { 
      throw new RuntimeException(e); 
     } finally { 
      try { 
       if (producer != null) { 
        producer.close(); 
       } 
       if (session != null) { 
        session.close(); 
       } 
      } catch (JMSException e) { 
       // handle error, should be non-fatal, as the message is already sent. 
      } 
     } 
    } 


    @PostConstruct 
    void init() { 
     initConnection(); 
     // other initialization logic 
     ... 
    } 

    @PreDestroy 
    void cleanUp() { 
     closeConnection(); 
     // other cleanup logic 
     ... 
    } 

    private void initConnection() { 
     try { 
      conn = factory.createConnection(); 
     } catch (JMSException e) { 
      throw new RuntimeException("Could not initialize connection", e); 
     } 
    } 

    private void closeConnection() { 
     try { 
      conn.close(); 
     } catch (JMSException e) { 
      // handle error, should be non-fatal, as the connection is being closed 
     } 
    } 
} 

J'espère que cela peut vous aider.

1

Je pense que ce que vous demandez est "Comment puis-je spécifier l'emplacement JNDI de la source de données JMS à utiliser pour un MDB?"

Dans ce cas, la réponse est:

@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/DefaultJMSProvider") 

Aussi, jetez un oeil à la page suivante qui fournit des charges de détails utiles sur la configuration BDM dans jBoss: http://www.jboss.org/community/docs/DOC-9352

Questions connexes