2016-06-16 2 views
0

J'insère des messages dans une file d'attente à l'aide de l'outil WebSphere MQ à l'aide du code Java. En entrant dans le texte, il va stocker le message dans la file d'attente. Je veux valider tout en insérant des messages siValidation des messages de la file d'attente

file d'attente 1.Le existe ou non

2.Is il une erreur de canal

non-concordance Numéro 3.Port

adresse 4.host erreur

Je veux capturer ces erreurs et les stocker dans un fichier texte avec horodatage et service dans le journal des erreurs.

Aidez-moi comment le faire.

Menu insertion de messages dans la file d'attente

Menu based insertion of messages in queue

Message inserted in Websphere MQ

public class {QueueMessage Scanner statique publique sc = new Scanner (System.in);

private MQQueueManager _queueManager = null; 
public int port = 1413; 
public String hostname = "192.168.100.120"; 
public String channel = "QM_HOME.Q_LOCAL"; 
public String qManager = "QM_HOME"; 
public String inputQName = "Q_LOCAL_END"; 
public String outputQName = "Q_LOCAL_END"; 

public QueueMessage() 
{ 
    super(); 
} 

public void init(String[] args) throws IllegalArgumentException 
{ 
    // Set up MQ environment 
    MQEnvironment.hostname = hostname; 
    System.out.println("HOST :"+hostname); 
    MQEnvironment.channel = channel; 
    MQEnvironment.port = port; 
    System.out.println("init"); 
} 

public void selectQMgr() throws MQException 
{ 

    _queueManager = new MQQueueManager(qManager); 

} 


public void write() throws MQException { 

    int openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING; 
    try { 
     MQQueue queue = _queueManager.accessQueue(outputQName, openOptions, 
       null, // default q manager 
       null, // no dynamic q name 
       null); // no alternate user id 

     DataInputStream input = new DataInputStream(System.in); 

     System.out 
       .println("MQWrite v1.0 connected and ready for input, terminate with ^Z\n\n"); 
     // Define a simple MQ message, and write some text in UTF format.. 
     MQMessage sendmsg = new MQMessage(); 
     sendmsg.format = MQC.MQFMT_STRING; 
     sendmsg.feedback = MQC.MQFB_NONE; 
     sendmsg.messageType = MQC.MQMT_DATAGRAM; 
     sendmsg.replyToQueueName = "QM_LOCAL_END"; 
     sendmsg.replyToQueueManagerName = qManager; 

     MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the 
     String line = null; 



     System.out.print("Enter your Message: "); 
     line = sc.nextLine(); 

     sendmsg.clearMessage(); 
     sendmsg.messageId = MQC.MQMI_NONE; 
     sendmsg.correlationId = MQC.MQCI_NONE; 
     sendmsg.writeString(line); 
     // put the message on the queue 
     queue.put(sendmsg, pmo); 

     System.out.println("Message inserted: " + line); 
     queue.close(); 
     _queueManager.disconnect(); 

     // same 
     // as MQPMO_DEFAULT constant 



    } 

    catch (com.ibm.mq.MQException mqex) { 
     System.out.println(mqex); 
    } catch (java.io.IOException ioex) { 
     System.out.println("An MQ IO error occurred : " + ioex); 

    } 
} 

private void While(boolean b) { 
    // TODO Auto-generated method stub 

} 

}

+0

On ne sait pas ce qui est demandé. L'outil affiché semble être MQ Explorer et vous ne pourrez pas accéder à l'écran de saisie de message si la file d'attente n'existe pas. Vous ne seriez pas en mesure de voir la liste des files d'attente si MQ Explorer n'était pas déjà connecté, auquel cas l'hôte, le port et le canal doivent être corrects. –

+0

Vous dites que vous utilisez du code Java - pourriez-vous nous montrer votre code Java? Je ne suis pas sûr de ce que les captures d'écran MQ Explorer ont à voir avec votre code Java? –

Répondre

1

en utilisant le code java

codage Java Standard - vous attrapez simplement le MQException.

try 
{ 
    _qMgr = new MQQueueManager(qMgrName, myHashTable); 
} 
catch (MQException e) 
{ 
    System.err.println("Completion Code=" + e.completionCode + " Reason Code=" + e.reasonCode); 
} 

Tout MQ est documenté dans le MQ Knowledge Center. Toutes les classes MQ/Java sont documentées - c'est-à-dire MQQueueManager class

La règle n ° 1 à retenir est que les noms d'objets (files d'attente, canaux, etc.) sont sensibles à la casse. Règle n ° 2 est que MQ n'est pas une base de données. Règle n ° 3, assurez-vous que votre application enregistre toutes les 'exceptions'.

1.Le file d'attente existe ou non

code Raison de 2085 (MQRC_UNKNOWN_OBJECT_NAME)

2.Is il une erreur de canal

Code Raison de 2009 (MQRC_CONNECTION_BROKEN)

nombre 3.Port mésappariement

Code de motif de 2059 (MQRC_Q_MGR_NOT_AVAILABLE)

4.Adresse hôte d'erreur

code Raison de 2538 (MQRC_HOST_NOT_AVAILABLE)

0

Voici mon code, il fonctionne très bien lors de l'insertion des messages, je veux capturer les erreurs si le message ne sont pas stockées dans Websphere MQ. Et pour stocker les erreurs dans un fichier journal

public class QueueMessage { public static Scanneur sc = new Scanner (System.in);

private MQQueueManager _queueManager = null; 
public int port = 1413; 
public String hostname = "192.168.100.120"; 
public String channel = "QM_HOME.Q_LOCAL"; 
public String qManager = "QM_HOME"; 
public String inputQName = "Q_LOCAL_END"; 
public String outputQName = "Q_LOCAL_END"; 

public QueueMessage() 
{ 
    super(); 
} 

public void init(String[] args) throws IllegalArgumentException 
{ 
    // Set up MQ environment 
    MQEnvironment.hostname = hostname; 
    MQEnvironment.channel = channel; 
    MQEnvironment.port = port; 

} 

public void selectQMgr() throws MQException 
{ 
    _queueManager = new MQQueueManager(qManager); 
} 


public void write() throws MQException { 

    int openOptions = MQC.MQOO_OUTPUT + MQC.MQOO_FAIL_IF_QUIESCING; 
    try { 
     MQQueue queue = _queueManager.accessQueue(outputQName, openOptions, 
       null, // default q manager 
       null, // no dynamic q name 
       null); // no alternate user id 

     DataInputStream input = new DataInputStream(System.in); 

     System.out 
       .println("MQWrite v1.0 connected and ready for input, terminate with ^Z\n\n"); 
     // Define a simple MQ message, and write some text in UTF format.. 
     MQMessage sendmsg = new MQMessage(); 
     sendmsg.format = MQC.MQFMT_STRING; 
     sendmsg.feedback = MQC.MQFB_NONE; 
     sendmsg.messageType = MQC.MQMT_DATAGRAM; 
     sendmsg.replyToQueueName = "QM_LOCAL_END"; 
     sendmsg.replyToQueueManagerName = qManager; 

     MQPutMessageOptions pmo = new MQPutMessageOptions(); // accept the 
     String line = null; // defaults, 

     System.out.print("Enter your Message: "); 
     line = sc.nextLine(); 
     sendmsg.clearMessage(); 
     sendmsg.messageId = MQC.MQMI_NONE; 
     sendmsg.correlationId = MQC.MQCI_NONE; 
     sendmsg.writeString(line); 
     // put the message on the queue 
     queue.put(sendmsg, pmo); 
     System.out.println("Message inserted: " + line); 
     queue.close(); 
     _queueManager.disconnect(); 

     // same 
     // as MQPMO_DEFAULT constant 

    } 

    catch (com.ibm.mq.MQException mqex) { 
     System.out.println(mqex); 
    } catch (java.io.IOException ioex) { 
     System.out.println("An MQ IO error occurred : " + ioex); 

    } 
} 

private void While(boolean b) { 
    // TODO Auto-generated method stub 

} 

}

0

Humm. Ce code semble familier - oh, attends, tu as téléchargé mon code d'exemple MQWrite. Tout d'abord, vous devriez éviter d'utiliser la classe MQEnvironment. Il est conçu pour les applications de base à un seul thread. Vous devez placer les informations dans un HashTable et les transmettre à la classe MQQueueManager.

Deuxièmement, l'ajout de la journalisation est une chose fondamentale de la programmation Java. Vous pouvez utiliser l'enregistreur intégré ou utiliser une classe tierce. J'ai utilisé Log4J pendant de nombreuses années. Voici donc un exemple de code MQWrite2 Java/MQ qui définit les informations de connexion dans un HashTable et utilise Log4J comme enregistreur.

import java.io.IOException; 
import java.util.Hashtable; 

import org.apache.log4j.Logger; 

import com.ibm.mq.MQException; 
import com.ibm.mq.MQMessage; 
import com.ibm.mq.MQPutMessageOptions; 
import com.ibm.mq.MQQueue; 
import com.ibm.mq.MQQueueManager; 
import com.ibm.mq.constants.CMQC; 

/** 
* Program Name 
* MQWrite2 
* 
* Description 
* This java class will connect to a queue manager and 
* and write a message to a queue. 
* 
* Sample Command Line Parameters 
* -h 127.0.0.1 -p 1414 -c MY.TEST.EXIT -m MQA1 -q TEST.Q1 
* 
* @author Roger Lacroix, Capitalware Inc. 
*/ 
public class MQWrite2 
{ 
    private Logger logger = Logger.getLogger(MQWrite2.class.getName()); 
    private Hashtable<String, String> params = null; 
    private Hashtable<String, Object> mqht = null; 
    private String qMgrName; 
    private String outputQName; 

    /** 
    * The constructor 
    */ 
    public MQWrite2() 
    { 
     super(); 
     logger.info("MQWrite2 is now starting."); 
    } 

    /** 
    * Make sure the required parameters are present. 
    * @return true/false 
    */ 
    private boolean allParamsPresent() 
    { 
     boolean b = params.containsKey("-h") && params.containsKey("-p") && 
        params.containsKey("-c") && params.containsKey("-m") && 
        params.containsKey("-q"); 
     if (b) 
     { 
     try 
     { 
      Integer.parseInt((String) params.get("-p")); 
     } 
     catch (NumberFormatException e) 
     { 
      b = false; 
     } 
     } 

     return b; 
    } 

    /** 
    * Extract the command-line parameters and initialize the MQ variables. 
    * @param args 
    * @throws IllegalArgumentException 
    */ 
    private void init(String[] args) throws IllegalArgumentException 
    { 
     params = new Hashtable<String, String>(); 
     if (args.length > 0 && (args.length % 2) == 0) 
     { 
     for (int i = 0; i < args.length; i += 2) 
     { 
      params.put(args[i], args[i + 1]); 
     } 
     } 
     else 
     { 
     throw new IllegalArgumentException(); 
     } 

     if (allParamsPresent()) 
     { 
     qMgrName = (String) params.get("-m"); 
     outputQName = (String) params.get("-q"); 

     mqht = new Hashtable<String, Object>(); 

     mqht.put(CMQC.CHANNEL_PROPERTY, params.get("-c")); 
     mqht.put(CMQC.HOST_NAME_PROPERTY, params.get("-h")); 

     try 
     { 
      mqht.put(CMQC.PORT_PROPERTY, new Integer(params.get("-p"))); 
     } 
     catch (NumberFormatException e) 
     { 
      mqht.put(CMQC.PORT_PROPERTY, new Integer(1414)); 
     } 

     // I don't want to see MQ exceptions at the console. 
     MQException.log = null; 
     } 
     else 
     { 
     throw new IllegalArgumentException(); 
     } 
    } 

    /** 
    * Connect, open queue, write a message, close queue and disconnect. 
    * 
    */ 
    private void testReceive() 
    { 
     int openOptions = CMQC.MQOO_OUTPUT + CMQC.MQOO_FAIL_IF_QUIESCING; 
     MQPutMessageOptions pmo = new MQPutMessageOptions(); 
     MQQueueManager _qMgr = null; 
     MQQueue queue = null; 
     MQMessage sendMsg = null; 
     String line = "This is a test message."; 

     try 
     { 
     _qMgr = new MQQueueManager(qMgrName, mqht); 
     queue = _qMgr.accessQueue(outputQName, openOptions); 

     sendMsg = new MQMessage(); 
     sendMsg.messageId = CMQC.MQMI_NONE; 
     sendMsg.correlationId = CMQC.MQCI_NONE; 
     sendMsg.writeString(line); 
     // put the message on the queue 
     queue.put(sendMsg, pmo); 
     logger.info("MQWrite2 Message inserted: " + line); 
     } 
     catch (MQException mqex) 
     { 
     logger.error("MQWrite2 MQException CC=" +mqex.completionCode + " : RC=" + mqex.reasonCode); 
     } 
     catch (IOException e) 
     { 
     logger.error("MQWrite2 IOException " + e.getLocalizedMessage()); 
     } 
     finally 
     { 
     try 
     { 
      if (queue != null) 
       queue.close(); 
     } 
     catch (MQException mqex2) 
     { 
      logger.error("MQWrite2 MQException CC=" +mqex2.completionCode + " : RC=" + mqex2.reasonCode); 
     } 
     finally 
     { 
      try 
      { 
       if (_qMgr != null) 
        _qMgr.disconnect(); 
      } 
      catch (MQException mqex3) 
      { 
       logger.error("MQWrite2 MQException CC=" +mqex3.completionCode + " : RC=" + mqex3.reasonCode); 
      } 
     } 
     } 

     logger.info("MQWrite2 is now ending."); 
    } 

    /** 
    * main line 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     MQWrite2 write = new MQWrite2(); 

     try 
     { 
     write.init(args); 
     write.testReceive(); 
     } 
     catch (IllegalArgumentException e) 
     { 
     System.out.println("Usage: java MQWrite2 -h host -p port -c channel -m QueueManagerName -q QueueName"); 
     System.exit(1); 
     } 

     System.exit(0); 
    } 
} 

Et voici le fichier « log4j.properties » qui va de pair avec le code:

# 
# stdout 
# 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%m%n 
# 
# MQWrite 
# 
log4j.category.MQWrite2=DEBUG, mqwrite, stdout 
#log4j.category.MQWrite2=INFO, mqwrite, stdout 
# "mqwrite" appender writes to a file 
log4j.appender.mqwrite=org.apache.log4j.RollingFileAppender 
log4j.appender.mqwrite.File=log/MQWrite.log 
log4j.appender.mqwrite.MaxFileSize=1000KB 
log4j.appender.mqwrite.MaxBackupIndex=9 
log4j.appender.mqwrite.layout=org.apache.log4j.PatternLayout 
log4j.appender.mqwrite.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %p - %m%n 
#log4j.appender.mqwrite.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %p (%F:%M:%L) - %m%n 

Assurez-vous de créer un répertoire « log » dans le répertoire où vous exécutez le code de ou bien il va lancer une erreur comme:

log4j:ERROR setFile(null,true) call failed. 
java.io.FileNotFoundException: log\MQWrite.log (The system cannot find the path specified) 
+0

Pssst. Vous pouvez lire et télécharger ici: http://www.capitalware.com/rl_blog/?p=3885 – Roger