Comment utiliser Java JMS avec MQseries

je suis en train de développer un JMS application autonome lire et écrire dans une file d'attente sur MQSeries. Mon patron m'a demandé d'utiliser pur java JMS (pas ibm.mq lib) pour le faire.

Voici les informations nécessaires pour faire la connexion jms:

  mq.hostname=10.10.10.10
  mq.channel=API.CLIENTCHL
  mq.queueManager=MQPETAPI
  mq.port=1422

Do vous savez comment faire, Ou avez-vous un lien qui m'apprennent à le faire.

31
demandé sur strmqm 2011-08-04 06:47:35

6 réponses

la question ici est l'exigence que "mon patron m'a demandé d'utiliser JMS java pur (pas ibm.mq lib) pour le faire."JMS est une spécification et chaque implémentation doit être conforme à L'API et à la sémantique, mais est libre de faire ce qu'elle veut à un niveau bas. Il est toujours nécessaire d'utiliser les classes de mise en œuvre fournies par le vendeur de transport. Par conséquent, si vous utilisez WebSphere MQ comme transport, vous devrez utiliser les classes IBM MQ JMS pour écrire un JMS. application.

cela dit, si vous vous en tenez à des appels API JMS purs, vous serez en mesure de brancher les classes de n'importe quel fournisseur de transport. C'est ce qui est généralement prévu lorsque vous êtes donné comme mentionné dans le post original.

il y a un article qui décrit exactement ce que vous cherchez à faire appelé lancer une application Java autonome sur WebSphere MQ V6.0 il n'utilise que L'API JMS et il utilise JNDI dans un système de fichiers local (un. fichier de liaisons). En échangeant les classes IBM JMS pour un autre fournisseur et en utilisant leurs outils JNDI, vous serez en mesure de brancher n'importe quel transport JMS sans changer votre code en utilisant cette approche.

si vous voulez faire la même chose sans JNDI, regardez les exemples de programmes fournis avec le client mq install où vous avez obtenu vos classes Java. Dans un système UNIX / Linux, ceux-ci sont en /opt/mqm/samp et sur Windows, ils sont dans install_dir/tools/jms/samples. SimpleRequestor.java exemple a le code suivant pour initialiser votre usine de connexion sans JNDI:

try {
  // Create a connection factory
  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "localhost");
  cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
  cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
  cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM1");

parce que cette approche n'utilise pas JNDI, vous êtes tenus d'écrire un code qui n'est pas transportable parmi les vendeurs de transport. C'est IBM WebSphere MQ spécifique.

Si vous avez attrapé la MQ pots de quelque part, et n'ont pas l'installation complète (et donc n'ont pas d'échantillons), vous pouvez le télécharger SupportPac MQC7. Le téléchargement est gratuit. En général, vous devez utiliser le dernier client, même avec un retour au niveau de gestionnaire de file d'attente. Il est évident que vous n'obtenez pas la fonctionnalité V7 d'un V6 QMgr, mais L'implémentation JMS dans le client V7 est nettement améliorée, même pour la fonctionnalité V6. Si pour une raison quelconque vous devez vraiment utiliser le client V6, vous pouvez le télécharger comme SupportPacMQC6. Quelle que soit la version client que vous utilisez, assurez-vous d'utiliser L'Infocentre correspondant.

V6 Infocenter

V7 Infocenter

enfin, la page d'accueil avec un index pour tous les supports est ici.

47
répondu T.Rob 2014-07-22 00:35:05

une application complète (synchrone) de JMS autonome avec TextMessage.

C'est IBM WebSphere MQ spécifique.

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

public class JMSApplicationStandAlone {
    public static void main(String[] args) {
        try {
            /*MQ Configuration*/
            MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
            mqQueueConnectionFactory.setHostName("localhost");
            mqQueueConnectionFactory.setChannel("MQ.CHANNEL");//communications link
            mqQueueConnectionFactory.setPort(1416);
            mqQueueConnectionFactory.setQueueManager("QUEUE.MGR");//service provider 
            mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

            /*Create Connection */
            QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
            queueConnection.start();

            /*Create session */
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            /*Create response queue */
            Queue queue = queueSession.createQueue("QUEUE.RESPONSE");


            /*Create text message */
            TextMessage textMessage = queueSession.createTextMessage("put some message here");
            textMessage.setJMSReplyTo(queue);
            textMessage.setJMSType("mcd://xmlns");//message type
            textMessage.setJMSExpiration(2*1000);//message expiration
            textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

            /*Create sender queue */
            QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));
            queueSender.setTimeToLive(2*1000);
            queueSender.send(textMessage);

            /*After sending a message we get message id */
            System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
            String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


            /*Within the session we have to create queue reciver */
            QueueReceiver queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);


            /*Receive the message from*/
            Message message = queueReceiver.receive(60*1000);
            String responseMsg = ((TextMessage) message).getText();

            queueSender.close();
            queueReceiver.close();
            queueSession.close();
            queueConnection.close();


        } catch (JMSException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Note: remplacer les valeurs de configuration

10
répondu Premraj 2015-08-06 09:41:07

si cela ne vous dérange pas d'écrire du code spécifique à WMQ, alors vous pouvez faire

MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);

d'habitude des ressources JMS

Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue"); // replace with real queue name
MessageProducer p = s.createProducer(q);

et enfin créer et envoyer un message

Message m = s.createTextMessage("Hello, World!);
p.send(m);

(j'ai tapé ça sur le dessus de ma tête donc je ne peux pas exclure une faute de frappe, mais c'est fondamentalement correct). Si vous êtes vraiment censé utiliser 'pure JMS' - c'est-à - dire sans objet spécifique à un fournisseur-alors vous devez lier un objet MQConnectionFactory dans JNDI (jetez un oeil à JMSAdmin l'outil, il est dans le docs) puis chercher à partir de votre application, i.e.

InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name
9
répondu strmqm 2011-08-04 07:18:24

typiquement avec JMS vous définiriez le QueueConnectionFactory dans votre conteneur via n'importe quel mécanisme de configuration qu'il rend disponible, puis l'ajouter au registre JNDI du conteneur. Chaque conteneur aurait ses propres méthodes pour faire cela (c.-à-d. Tomcat versus WebSphere).

si vous voulez renoncer à JNDI, vous pouvez créer une instance de com.ibm.mq.jms.MQQueueConnectionFactory directement et mettez les propriétés hostname, port, quaemanager et channel dessus. Vous pouvez alors utiliser cet objet comme vous le feriez exemple javax.jms.QueueConnectionFactory depuis qu'il implémente.

2
répondu laz 2011-08-04 04:27:38

je ne peux pas vous enseigner JMS dans un seul post, mais je peux vous diriger vers les ressources que j'ai utilisé pour apprendre moi-même:

  1. O'Reilly Java Message Service livre
  2. IBM Developerworks JMS Tutorial (plus MQSeries/Websphere MQ spécifique)
  3. the Spring framework peut vous aider à utiliser JMS plus efficacement, surtout si vous développez une application autonome en dehors d'un serveur d'application J2EE: Message Java De Printemps Le Service de documentation
2
répondu Kaypro II 2011-08-04 04:31:14

C'est assez commun. Ici en sont quelques exemples.

0
répondu Preston 2011-08-04 03:50:14