【问题标题】:Validating queue messages验证队列消息
【发布时间】:2016-06-18 07:44:08
【问题描述】:

我正在使用 Java 代码使用 WebSphere MQ 工具在队列中插入消息。在输入文本时,它会将消息存储在队列中。我想在插入消息时验证是否

1.队列存在与否

2.是否有通道错误

3.端口号不匹配

4.主机地址错误

我想捕获这些错误并将其存储在带有时间戳的文本文件中,并在错误日志中提供服务。

帮我怎么做。

在队列中插入消息的菜单

Menu based insertion of messages in queue

Message inserted in Websphere MQ

公共类QueueMessage { public static Sc​​anner 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

}

}

【问题讨论】:

  • 目前还不清楚要问什么。显示的工具似乎是 MQ Explorer,如果队列不存在,您将无法进入消息输入屏幕。如果 MQ Explorer 尚未连接,您将无法看到队列列表,在这种情况下,主机、端口和通道必须正确。
  • 您说您正在使用 Java 代码 - 您能向我们展示您的 Java 代码吗?我不确定 MQ Explorer 屏幕截图与您的 Java 代码有什么关系?

标签: java smtp ibm-mq ftp-client


【解决方案1】:

使用java代码

标准 Java 编码 - 您只需捕获 MQException。

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

关于 MQ 的所有内容都记录在 MQ Knowledge Center 中。所有 MQ/Java 类都记录在案 - 即MQQueueManager class

要记住的第一条规则是对象名称(队列、通道等)区分大小写。规则 #2 是 MQ 不是数据库。规则 #3,确保您的应用程序记录所有“异常”。

1.队列存在与否

2085 的原因代码(MQRC_UNKNOWN_OBJECT_NAME)

2.是否有通道错误

2009 年的原因代码 (MQRC_CONNECTION_BROKEN)

3.端口号不匹配

2059 的原因代码 (MQRC_Q_MGR_NOT_AVAILABLE)

4.主机地址错误

2538的原因码(MQRC_HOST_NOT_AVAILABLE)

【讨论】:

    【解决方案2】:

    这是我的代码,它在插入消息时工作正常,如果消息未存储在 Websphere MQ 中,我想捕获错误。并将错误存储在日志文件中

    公共类QueueMessage { public static Sc​​anner 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
    
    }
    

    }

    【讨论】:

      【解决方案3】:

      嗯。该代码看起来很熟悉 - 哦,等等,你下载了我的 MQWrite 示例代码。

      首先,您应该远离使用 MQEnvironment 类。它专为基本的单线程应用程序而设计。您应该将信息放在一个 HashTable 中并将其传递给 MQQueueManager 类。

      其次,添加日志记录是 Java 编程的基本内容。您可以使用内置记录器或使用 3rd 方类。我使用 Log4J 已经很多很多年了。

      所以,这里是 MQWrite2 Java/MQ 示例代码,它在 HashTable 中设置连接信息并使用 Log4J 作为记录器。

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

      这里是代码附带的“log4j.properties”文件:

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

      确保在运行代码的目录下创建一个“日志”目录,否则会抛出如下错误:

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

      【讨论】:

      猜你喜欢
      • 2018-08-29
      • 2015-08-22
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2020-11-27
      • 2020-04-18
      • 2011-02-20
      相关资源
      最近更新 更多