home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Java / Java.zip / mqaoad21.zip / LMSMQExt.java < prev    next >
Text File  |  2003-01-13  |  15KB  |  348 lines

  1. package com.ibm.extricity.adapters.mqseries.mqak;
  2.  
  3. /**
  4.  * LMSMQExt.java 1.0    10/20/2000
  5.  *
  6.  * The LMSMQExt is derived from <EM>LMSMQ</EM> class.
  7.  * This class is used to extend the MQ LMS for use with Extricity
  8.  *
  9.  * OCO Source Materials
  10.  *
  11.  * 5799-RNK
  12.  *
  13.  * (C) Copyright IBM Corp. 2000
  14.  *
  15.  * The source code for this program is not published
  16.  * or otherwise divested of its trade secrets,
  17.  * irrespective of what has been deposited with the
  18.  * U. S. Copyright Office.
  19.  *
  20.  * @author Thomas W. Jaworski
  21. **/
  22. import java.lang.*;
  23. import java.util.*;
  24.  
  25. import com.ibm.epic.common.*;
  26. import java.io.*;
  27. import com.ibm.epic.adapters.eak.nativeadapter.*;
  28. import com.ibm.epic.adapters.eak.common.*;
  29. import com.ibm.epic.adapters.eak.mcs.*;
  30.  
  31. import com.ibm.mq.*;
  32.                      // Need to include the com.ibm.mq.jar file in
  33.                      // the classpath.
  34. import com.ibm.epic.trace.exception.*;
  35. import com.ibm.epic.trace.client.*;
  36. import com.ibm.logging.*;
  37.  
  38. public class LMSMQExt extends com.ibm.epic.adapters.eak.nativeadapter.LMSMQ
  39. {
  40.    //private com.ibm.mq.MQMessage receivedRequestMQMessage;
  41.  
  42.    /** Class Name to use in messages **/
  43.    private static final String CLASS_NAME = "com.ibm.extricity.adapters.mqseries.mqak.LMSMQExt";
  44.  
  45.    /** Default formatter to use **/
  46.    private static java.lang.String defaultFormatterName = "com.ibm.extricity.adapters.mqseries.mqak.MQNMRFH2FormatterExt";
  47.  
  48.    /** Communication Mode Name **/
  49.    private static final String mode = "com.ibm.extricity.adapters.mqseries.mqak.LMSMQExt";
  50.  
  51. /** Gets the default formatter name.  Implemented by subclass.
  52. * @return String Component Name
  53. *
  54. **/
  55. protected String getDefaultFormatterName()
  56. {
  57.    return defaultFormatterName;
  58. }
  59.  
  60. /**
  61.  * Gets the commmunication mode.
  62.  * @return String
  63. **/
  64. public String getMode()
  65. {
  66.    return mode;
  67. }
  68.  
  69. /**
  70.  * Reads the xml from queue determined from the ENAService values.
  71.  * <UL>
  72.  * <LI>If the received message is a request the MQMessage object
  73.  * is stored, otherwise any previous request information is deleted.</LI>
  74.  * </UL>
  75.  *
  76.  * The receive queue name to
  77.  * use is obtained from the DirectoryService.  Criteria used is:
  78.  * <UL>
  79.  * <LI>Application Id from inputted ENAService.</LI>
  80.  * <LI>Body Category from inputted ENAService.</LI>
  81.  * <LI>Body Type from inputted ENAService.</LI>
  82.  * </UL>
  83.  * @param _enaService ENAService object
  84.  * @return EpicMessage or null if no message.
  85.  * @exception AdapterException Re-throws and if other exceptions received.
  86. **/
  87. public EpicMessage receiveRequest(ENAService enaService)
  88.    throws AdapterException
  89. {
  90.    int timeout;
  91.  
  92.    if (trace)
  93.           traceClient.writeTrace(IRecordType.TYPE_ENTRY, CLASS_NAME,
  94.                                                 "receiveRequest(ENAService)", "AQM5001", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[]{"AQM5001"}); //@P6C
  95.  
  96.    setReceivedRequestMQMessage(null); // Set back to null, free's up memory.
  97.  
  98.    MQQueue putQ = getQueueCollection().getReceiveQueue( enaService ) ;
  99.  
  100.    // Check which timeout to use
  101.    if(enaService.getTimout() == enaService.USE_DEFAULT_TIMEOUT)
  102.    {
  103.           //int timeout = getQueueCollection().getReceiveTimeout( enaService );
  104.           timeout = getReceiveTimeOut(enaService.getApplicationName(),
  105.                                                    enaService.getBodyCategory(),
  106.                                                    enaService.getBodyType());
  107.    }
  108.    else
  109.    {
  110.           timeout = enaService.getTimout();
  111.    }
  112.  
  113.    EpicMessageExt emR = null; // Return
  114.  
  115.    MQMessage mqMessage = null;
  116.    MQGetMessageOptions mqGMO = null;
  117.    String strMessage = null;
  118.  
  119.    try
  120.    {
  121.           if (trace)
  122.           {
  123.                  int num_msgs = putQ.getCurrentDepth();
  124.                  traceClient.writeTrace(IRecordType.TYPE_INFO, CLASS_NAME,
  125.                                                 "receiveRequest(ENAService)", "AQM5003", AdapterUtil.DEFAULTTRACEMSGFILE,
  126.                                                 new Object[]{"AQM5003", "messages in the queue",
  127.                                                                  new Integer(num_msgs)}); //@P6C
  128.           }
  129.  
  130.           mqMessage = new MQMessage();
  131.  
  132.           mqGMO = new MQGetMessageOptions();
  133.           mqGMO.options = MQC.MQGMO_FAIL_IF_QUIESCING // Stop if qmanager shutting down
  134.                  | MQC.MQGMO_CONVERT ;// Suggested by Greg Brail
  135.  
  136.           // Check if we have any filtering to do
  137.           Enumeration filterNames = enaService.getAllFilterNames();
  138.           while(filterNames.hasMoreElements())
  139.           {
  140.                  String filterName = (String)filterNames.nextElement();
  141.                  if(filterName == enaService.FILTERNAME_LMS_MESSAGE_ID)
  142.                  {
  143.                         mqMessage.messageId = EpicMessageExt.decodeLMSMessageID(enaService.getFilter(filterName));
  144.                         mqGMO.matchOptions |= MQC.MQMO_MATCH_MSG_ID;
  145.                  }
  146.                  else if(filterName == enaService.FILTERNAME_LMS_CORRELATION_ID)
  147.                  {
  148.                         mqMessage.correlationId = EpicMessageExt.decodeLMSCorrelationID(enaService.getFilter(filterName));
  149.                         mqGMO.matchOptions |= MQC.MQMO_MATCH_CORREL_ID;
  150.                  }
  151.                  /*
  152.                  else
  153.                  {
  154.                    //$$$ Indicate and save header filters
  155.                  }
  156.                  */
  157.           }
  158.           /*
  159.           //$$$ Setup a loop which peeks at all mesages meeting the current criteria
  160.           //    and then checks each one if it matches the header filter criteria
  161.           //    the header matching criteria have to be matched based on the Formater
  162.           //    returned values as we do not directly know how to interpret field
  163.           //    names.  This might necesitate an extension to the formater!
  164.           */
  165.  
  166.           // Check for peek
  167.           if(enaService.getPeekOnly())
  168.           {
  169.                  mqGMO.options |= MQC.MQGMO_BROWSE_FIRST;
  170.           }
  171.           // No transactioning for peek required!
  172.           else
  173.           {
  174. // If running in a transaction - then receive using commit control
  175.                  if (isTransacted())                                                   // @P16 A
  176.                         mqGMO.options |= MQC.MQGMO_SYNCPOINT;                                  // @P16 A
  177.           }
  178.  
  179.           setTimeOutOptions(timeout, mqGMO);
  180.  
  181.           putQ.get(mqMessage, mqGMO);
  182.           // If a request then hold reference to it for future
  183.           // replies.
  184.           if(mqMessage.messageType  == MQC.MQMT_REQUEST)
  185.           {
  186.                  if (trace)
  187.                  {
  188.                         traceClient.writeTrace(IRecordType.TYPE_INFO, CLASS_NAME,
  189.                                                         "receiveRequest(ENAService)", "AQM5156", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[]{"AQM5156"}); //@P6C /*received a request*/
  190.                         traceClient.writeTrace(IRecordType.TYPE_INFO, CLASS_NAME,
  191.                                                   "receiveRequest(ENAService)", "AQM5003", AdapterUtil.DEFAULTTRACEMSGFILE,
  192.                                                   new Object[]{"AQM5003", "MQMessage",
  193.                                                          LMSMQ.stringMQMessageUtil(mqMessage, true)}); //@P6C
  194.                  }
  195.  
  196.                  // Do not set the request data if we are only peeking
  197.                  if(!enaService.getPeekOnly())
  198.                  {
  199.                         setReceivedRequestMQMessage(mqMessage);
  200.                         setEnaService(enaService);
  201.                  }
  202.           } else {
  203.                  if (trace)
  204.                         traceClient.writeTrace(IRecordType.TYPE_INFO, CLASS_NAME,
  205.                                                         "receiveRequest(ENAService)", "AQM5157", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[]{"AQM5157"}); //@P6C /*received a datagram*/
  206.           }
  207.    } catch (MQException e) {
  208.           if (e.completionCode == MQException.MQCC_FAILED)
  209.           {
  210.                  switch (e.reasonCode)
  211.                  {
  212.                         case MQException.MQRC_NO_MSG_AVAILABLE :
  213.                         {
  214.                            if (trace)
  215.                                   traceClient.writeTrace(IRecordType.TYPE_INFO, CLASS_NAME,
  216.                                                         "receiveRequest(ENAService)", "AQM5158", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[]{"AQM5158"}); //@P6C /*no msgs, timeout*/
  217.                            return emR;
  218.                         } // end case MQException.MQRC_NO_MSG_AVAILABLE:
  219.                         case MQException.MQRC_Q_MGR_STOPPING :
  220.  
  221.                         case MQException.MQRC_Q_MGR_QUIESCING :
  222.                         {
  223.                            if (trace)
  224.                                   traceClient.writeTrace(IRecordType.TYPE_INFO, CLASS_NAME,
  225.                                                         "receiveRequest(ENAService)", "AQM5159", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[]{"AQM5159"}); //@P6C /*MQSeries stopping*/
  226.                            return emR;
  227.                         } // end case MQException.MQRC_Q_MGR_QUIESCING:
  228.                  } // end switch
  229.           } // end if (e.completionCode == MQException.MQCC_FAILED)
  230.  
  231.  
  232.           throw new AdapterException("AQM0109", new Object[]{"AQM0109",
  233.                  (CLASS_NAME + "::receiveRequest(ENAService)"),
  234.                  getQueueManagerName(),
  235.                  "",
  236.                  (new Integer(e.completionCode)).toString(),
  237.                  (new Integer(e.reasonCode)).toString()
  238.                  });
  239.  
  240.  
  241.    } // end catch
  242.    try {
  243.           emR = (EpicMessageExt)unmarshallMessage(mqMessage, enaService);
  244.    }
  245.    catch(OutOfMemoryError e)
  246.    {
  247.           setReceivedRequestMQMessage(null);
  248.  
  249.           if (trace)
  250.                  traceClient.writeTrace(IRecordType.TYPE_ERR, CLASS_NAME,
  251.                                                  "receiveRequest(ENAService)", "AQM5160", AdapterUtil.DEFAULTTRACEMSGFILE,
  252.                                                  new Object[]{"AQM5160", "rollback()"});
  253.           throw e;
  254.    } catch(AdapterException e) {
  255.           setReceivedRequestMQMessage(null);
  256.  
  257.           if (trace)
  258.                  traceClient.writeTrace(IRecordType.TYPE_ERROR_EXC, CLASS_NAME,
  259.                                                  "receiveRequest(ENAService)", "AQM5004", AdapterUtil.DEFAULTTRACEMSGFILE,
  260.                                                  new Object[]{"AQM5004", e.getClass().getName(),
  261.                                                                    e.getMessage(),"unmarshallMessage()"});
  262.           throw e;
  263.    } catch(Throwable e) {
  264.           setReceivedRequestMQMessage(null);
  265.  
  266.           if (trace)
  267.                  traceClient.writeTrace(IRecordType.TYPE_ERROR_EXC, CLASS_NAME,
  268.                                                  "receiveRequest(ENAService)", "AQM5004", AdapterUtil.DEFAULTTRACEMSGFILE,
  269.                                                  new Object[]{"AQM5004", e.getClass().getName(),
  270.                                                                    e.getMessage(),"unmarshallMessage()"});
  271.  
  272.           throw new AdapterException("AQM0002", new Object[]{"AQM0002",
  273.                  (CLASS_NAME + "::receiveRequest(ENAService)"),
  274.                  e.getClass().getName(),
  275.            EpicException.convertNulltoEmptyString(e.getMessage()),
  276.                         new FormatEpicNLSMessage(AdapterException.PROP_NAME).formatMessage
  277.                            ("AQM2032",new Object[]{AdapterUtil.convertStackTraceToString(e)})
  278.                  });
  279.    }
  280.  
  281.    if (trace)
  282.           traceClient.writeTrace(IRecordType.TYPE_EXIT, CLASS_NAME,
  283.                                                 "receiveRequest(ENAService)", "AQM5002", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[]{"AQM5002"});
  284.    return emR;
  285.  
  286. }
  287.  
  288. /**
  289.  * Converts the EpicMessage to an XML document and puts the xml to
  290.  * a queue.  The destination queue name to use is obtained
  291.  * from the DirectoryService.  Criteria used is:
  292.  * <UL>
  293.  * <LI>Destination Application Id from inputted EpicMessage.</LI>
  294.  * <LI>Body Category from inputted EpicMessage.</LI>
  295.  * <LI>Body Type from inputted EpicMessage.</LI>
  296.  * </UL>
  297.  *
  298.  * @param epicMessage EpicMessage Object reference
  299.  * @see #getReceiveQName(java.lang.String,java.lang.String,java.lang.String)
  300.  * @exception AdapterException Re-throws
  301.  **/
  302. public void sendMsg(EpicMessage epicMessageOrg) throws AdapterException
  303. {
  304.    // Make sure we have the extended EpicMessage
  305.    if(!(epicMessageOrg instanceof EpicMessageExt))
  306.    {
  307.           super.sendMsg(epicMessageOrg);
  308.           return;
  309.    }
  310.  
  311.    EpicMessageExt epicMessage = (EpicMessageExt)epicMessageOrg;
  312.  
  313.    if (trace)
  314.           traceClient.writeTrace(IRecordType.TYPE_ENTRY, CLASS_NAME, "sendMsg(EpicMessage)", "AQM5001", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[] {"AQM5001"}); //@P6C
  315.  
  316.  
  317.    MQQueue putQ = getQueueCollection().getSendingQueue( epicMessage ) ;
  318.  
  319.    try {
  320.           MQMessage mqMessage = createMQMessage(epicMessage);
  321.           MQPutMessageOptions mqPMO = new MQPutMessageOptions();
  322.           if (isTransacted())  {
  323.                  mqPMO.options &= ~MQC.MQPMO_NO_SYNCPOINT;
  324.                  mqPMO.options |= MQC.MQPMO_SYNCPOINT;
  325.           }
  326.           putQ.put(mqMessage, mqPMO);
  327.  
  328.           epicMessage.setLMSMessageID(mqMessage.messageId);
  329.           epicMessage.setLMSCorrelationID(mqMessage.correlationId);
  330.  
  331.    } catch (MQException e) {
  332.           // @P4C {
  333.  
  334.           AdapterException ae = new AdapterException("AQM0108", new Object[] {"AQM0108", (CLASS_NAME + "::sendMsg(EpicMessage)"), /* @P1c */
  335.           getQueueManagerName(), "", (new Integer(e.completionCode)).toString(), (new Integer(e.reasonCode)).toString()});
  336.           if (trace)
  337.                  traceClient.writeTrace(IRecordType.TYPE_ERROR_EXC, CLASS_NAME, "sendMsg(EpicMessage)", "AQM5011", /*@P12C*/
  338.                  AdapterUtil.DEFAULTTRACEMSGFILE, new Object[] {"AQM5011", ae.getClass().getName(), ae.getMessage()}); //@P6C //@P9C
  339.  
  340.           throw ae;
  341.    }
  342.  
  343.    if (trace)
  344.           traceClient.writeTrace(IRecordType.TYPE_EXIT, CLASS_NAME, "sendMsg(EpicMessage)", "AQM5002", AdapterUtil.DEFAULTTRACEMSGFILE, new Object[] {"AQM5002"}); //@P6C
  345.    return;
  346. }
  347. }
  348.