Package com.sun.messaging.jmq.jmsserver.core

Examples of com.sun.messaging.jmq.jmsserver.core.PacketReference


            Hashtable dmqProps, PacketReference remoteRef, boolean wait)
            throws BrokerException
    {
        RemoveMessageReturnInfo ret = new RemoveMessageReturnInfo();

        PacketReference ref = null;

        // LKS-XXX revisit if it is really necessary to load the
        // message before removing it
        if (!loaded ) {
            load();
        }

        // OK .. first deal w/ Lbit
        // specifically .. we cant remove it IF the Lbit
        // is set
        ref = (PacketReference)destMessages.get(id);
        if (ref == null) {
            // message already gone
            removePacketList(id, getDestinationUID());
            logger.log(Logger.DEBUG, "Reference already gone for " + id);
            return ret;
        }

        if (remoteRef != null && remoteRef != ref) {
            logger.log(((DEBUG_CLUSTER||DEBUG) ? Logger.INFO:Logger.DEBUG),
                       "Reference for "+id+" is overrided, not remove");
            remoteRef.setInvalid();
            return ret;
        }

        ExpirationInfo ei = ref.getExpiration();

        if (r == RemoveReason.EXPIRED || r == RemoveReason.PURGED) {
            if (!ref.checkDeliveryAndSetInRemoval()) {

                if (r == RemoveReason.EXPIRED && !EXPIRE_DELIVERED_MSG) {
                    logger.log(((DEBUG_CLUSTER||DEBUG) ? Logger.INFO:Logger.DEBUG),
                        "Message "+ref.getSysMessageID()+" is not "+r+
                        " because it has been delivered to client");
                    if (ei != null) {
                        ei.clearReapCount();
                    }
                    ret.indelivery = true;
                    return ret;
                }
                if (r == RemoveReason.PURGED && !PURGE_DELIVERED_MSG) {
                    logger.log(((DEBUG_CLUSTER||DEBUG) ? Logger.INFO:Logger.DEBUG),
                        "Message "+ref.getSysMessageID()+" is not "+r+
                        " because it has been delivered to client");
                    ret.indelivery = true;
                    return ret;
                }
            }
        }

        synchronized(ref) {
            if (ref.getLBitSet()) {
                ref.setInvalid();
                if (r == RemoveReason.EXPIRED && ei != null) {
                    ei.clearReapCount();
                }
                logger.log(Logger.DEBUG,"LBit set for " + id);
                return ret;
            }
        }

        synchronized(destMessagesInRemoving) {
            if (destMessagesInRemoving.get(id) != null && !wait) {
                logger.log(((DEBUG_CLUSTER||DEBUG) ? Logger.INFO:Logger.DEBUG),
                           "Reference "+id +" is being removed by another thread ");
                return ret;
            }
            destMessagesInRemoving.put(id, id);
        }

        try {

            synchronized(_removeMessageLock) {
                if (destMessages.get(id) == null) {
                    logger.log(((DEBUG_CLUSTER||DEBUG) ? Logger.INFO:Logger.DEBUG),
                           "Reference has already been removed for " + id);
                    return ret;
                }

            // handle DMQ
            // OK we need to move the message TO the DMQ before removing it
            // OK .. if we arent the DMQ and we want to use the DMQ
            if (!isInternal() &&
                (r == RemoveReason.EXPIRED ||
                 r == RemoveReason.EXPIRED_BY_CLIENT ||
                 r == RemoveReason.EXPIRED_ON_DELIVERY ||
                 r == RemoveReason.REMOVED_LOW_PRIORITY ||
                 r == RemoveReason.REMOVED_OLDEST ||
                 r == RemoveReason.ERROR ||
                 r == RemoveReason.UNDELIVERABLE)) {
                 markDead(ref, r, dmqProps);
            }

            // OK really remove the message
            ref.setInvalid();
            ref = (PacketReference) destMessages.remove(id, r);

            } //synchronized(_removeMessageLock)

            assert ref != null;

            if (ref == null) {
                logger.log(((DEBUG_CLUSTER||DEBUG) ? Logger.INFO:Logger.DEBUG),
                           "Reference has already gone for " + id);
                return ret;
            }

            long l = ref.byteSize();

            // clears out packet, must happen after DMQ
            _messageRemoved(ref, ref.byteSize(), r, true);

            ref.destroy();

            synchronized(this) {
                msgsOut += 1;
                msgBytesOut += ref.byteSize();
                msgsOutInternal += 1;
                if (msgsOutInternal >= Integer.MAX_VALUE) {
                    msgsInOutLastResetTime = System.currentTimeMillis();
                    msgsInInternal = 0;
                    msgsOutInternal = 0;
View Full Code Here


      DestinationUID duid = msg.getDestUID();

      logger.log(Logger.DEBUG,
          " handleSentMessages: duid= "+duid);
           
      PacketReference pr = PacketReference.createReference(packet, duid,
          null);
      Destination d = Destination.getDestination(duid);
      if (d == null) {
        // Could be an auto-created dest that was reaped on load.
        // Lets recreate it here.
        try {
          int type = (duid.isQueue() ? DestType.DEST_TYPE_QUEUE
              : DestType.DEST_TYPE_TOPIC);
          d = Destination.getDestination(duid.getName(), type, true,
              true);
        } catch (IOException e) {
          throw new BrokerException("Could not recreate destination "
              + duid, e);
        }
      }
     
      // check it is loaded
      d.load();
     
      logger.log(Logger.DEBUG,
          " loadTransactions: processing prepared sent message "
              + packet.getMessageID()) ;

      // queue message
      boolean result = d.queueMessage(pr, true);

      // store (should not really be persisted as we are using txnLog)
      // pr.store();

      // add message to transaction
      transactionList.addMessage(pr.getTransactionID(), pr
          .getSysMessageID(), true);

    }
  }
View Full Code Here

    logger.log(Logger.DEBUG,
        " trying to unroute prepared acknowledged message: destID =  "
            + destID + " ackedMsgId=" + ackedSysMsgID);
   
    Destination dest = null;
    PacketReference ackedMessage = null;
    if (destID != null) {
      dest = Destination.getDestination(destID);
      if (dest != null) {
        dest.load();
        ackedMessage = dest.getMessage(ackedSysMsgID);
        if (ackedMessage == null) {

          String msg = "Could not find packet for " + ackedSysMsgID
              + "in dest " + dest;
          logger.log(Logger.WARNING, msg);
          return;
        }
      } else {
        // this could happen e.g. if empty auto dest has been destroyed
        String msg = "Could not find destination for " + destID;
        logger.log(Logger.WARNING, msg);
        return;
      }

    } else {
      // no destid stored for some reason so need to load all dests
      logger.log(Logger.WARNING,
          "No dest ID for acked message. Will need to load all dests "
              + ackedSysMsgID);
      loadDestinations();

      ackedMessage = Destination.get(ackedSysMsgID);
      dest = ackedMessage.getDestination();
    }

    // need to unroute messages that have been consumed in a prepared
    // transaction.
    // they cannot be redelivered unless the transaction rolls back.
View Full Code Here

        objectOutputStream.close();
        byteArrayOutputStream.close();
        pkt.setMessageBody(messageBody);

        PacketReference ref = PacketReference.createReference(pkt, null);

        destination.queueMessage(ref, false);
        Set s =destination.routeNewMessage(ref);
        destination.forwardMessage(s, ref);
View Full Code Here

        // DEBUG only - no reason to localize
        logger.log(Logger.INFO,"DEBUG: Dumping order");
        int i =0;
        Iterator itr = s.iterator();
        while (itr.hasNext()) {
            PacketReference n = (PacketReference)itr.next();
            logger.log(Logger.INFO, n.getPriority() +
                 " : " + n.getTime() + " :" + n.getSequence()
                 + "  " + n.getSysMessageID() + " : " + n.getPacket().getTimestamp());
        }
    }
View Full Code Here

    public static void remoteCheckTakeoverMsgs(Map msgs, String brokerid) throws BrokerException {
        Set destroyConns = new HashSet();
        Iterator msgitr =  msgs.keySet().iterator();
        while (msgitr.hasNext()) {
            SysMessageID sysid = SysMessageID.get((String)msgitr.next());
            PacketReference ref = (PacketReference)Destination.get(sysid);
            if (ref == null) continue;
            Iterator cnitr = ref.getRemoteConsumerUIDs().values().iterator();
            while (cnitr.hasNext()) {
                destroyConns.add(cnitr.next());
            }
        }
        destroyConnections(destroyConns, GoodbyeReason.BKR_IN_TAKEOVER,
View Full Code Here

    public static String getNextMessageID(ConsumerUID cid) {
  Consumer con = Consumer.getConsumer(cid);

  if (con != null)  {
      PacketReference r =  con.peekNext();
        if (r != null)
                return r.getSysMessageID().toString();
  }
    return "";
    }
View Full Code Here

                }
                throw ex;
            }

            dUID = DestinationUID.getUID(p.getDestination(), p.getIsQueue());
            PacketReference pr = PacketReference.createReference(p, dUID, null);

            // mark already stored and make packet a SoftReference to
            // prevent running out of memory if dest has lots of msgs
            pr.setLoaded();
            logger.log(Logger.DEBUG,"Loading message " + pr.getSysMessageID()
                   + " on " + pr.getDestinationUID());
          
            // check transactions
            TransactionUID tid = pr.getTransactionID();
            if (tid != null) {
                // see if in transaction list
                if (txns.contains(tid)) {
                    // open transaction
                    TransactionState ts = Globals.getTransactionList()
                             .retrieveState(pr.getTransactionID());
                    if (ts != null &&
                        ts.getState() != TransactionState.ROLLEDBACK &&
                        ts.getState() != TransactionState.COMMITTED) {
                        // in transaction ...
                        logger.log(Logger.DEBUG, "Processing open transacted message " +
                               pr.getSysMessageID() + " on " + tid +
                               "["+TransactionState.toString(ts.getState())+"]");
                        openMessages.put(pr.getSysMessageID(), tid);
                    else if (ts != null && ts.getState() == TransactionState.ROLLEDBACK) {
                        pr.destroy();
                        continue;
                    } else {
                    }
                }
            }
            packetlistAdd(pr.getSysMessageID(), pr.getDestinationUID());

            Set l = null;
            if ((l = (Set)m.get(dUID)) == null) {
                l = new TreeSet(new RefCompare());
                m.put(dUID, l);
            }
            l.add(pr);
        }

        // OK, handle determining how to queue the messages

        // first add all messages

        Iterator dsts = m.entrySet().iterator();
        while (dsts.hasNext()) {
            Map.Entry entry = (Map.Entry)dsts.next();
            DestinationUID dst = (DestinationUID) entry.getKey();
            Set l = (Set)entry.getValue();
            Destination d = Destination.getDestination(dst);

            if (d == null) { // create it
                try {
                d = Destination.getDestination(dst.getName(),
                     (dst.isQueue()? DestType.DEST_TYPE_QUEUE:
                          DestType.DEST_TYPE_TOPIC) , true, true);
                } catch (IOException ex) {
                     throw new BrokerException(
                         Globals.getBrokerResources().getKString(
                         BrokerResources.X_CANT_LOAD_DEST, d.getName()));
                }
            } else {
                synchronized(d) {
                    if (d.isLoaded()) {
                        // Destination has already been loaded so just called
                        // initialize() to update the size and bytes variables
                        d.initialize();
                    }
                    d.load(l);
                }
            }
            logger.log(Logger.INFO,
                BrokerResources.I_LOADING_DST,
                   d.getName(), String.valueOf(l.size()));

            // now we're sorted, process
            Iterator litr = l.iterator();
            try {
                while (litr.hasNext()) {
   
                    PacketReference pr = (PacketReference)litr.next();
                    try {
                        // ok allow overrun
                        boolean el = d.destMessages.getEnforceLimits();

                        d.destMessages.enforceLimits(false);

                        pr.lock();
                        d.putMessage(pr, AddReason.LOADED, true);
                        // turn off overrun
                        d.destMessages.enforceLimits(el);
                    } catch (IllegalStateException ex) {
                        // thats ok, we already exists
                        String args[] = { pr.getSysMessageID().toString(),
                            pr.getDestinationUID().toString(),
                            ex.getMessage() };
                        logger.logStack(Logger.WARNING,
                              BrokerResources.W_CAN_NOT_LOAD_MSG,
                               args, ex);
                        continue;
                    } catch (OutOfLimitsException ex) {
                        String args[] = { pr.getSysMessageID().toString(),
                            pr.getDestinationUID().toString(),
                            ex.getMessage() };
                        logger.logStack(Logger.WARNING,
                              BrokerResources.W_CAN_NOT_LOAD_MSG,
                               args, ex);
                        continue;
                    }
              }
              // then resort the destination
              d.sort(new RefCompare());
           } catch (Exception ex) {
           }
        }

        // now route

        dsts = m.entrySet().iterator();
        while (dsts.hasNext()) {
            Map.Entry entry = (Map.Entry)dsts.next();
            DestinationUID dst = (DestinationUID) entry.getKey();
            Set l = (Set)entry.getValue();
            Destination d = Destination.getDestination(dst);

            // now we're sorted, process
            Iterator litr = l.iterator();
            try {
                while (litr.hasNext()) {
                    PacketReference pr = (PacketReference)litr.next();
                    TransactionUID tuid = (TransactionUID)openMessages.get(pr.getSysMessageID());
                    if (tuid != null) {
                        Globals.getTransactionList().addMessage(tuid,
                                                     pr.getSysMessageID(), true);
                        pr.unlock();
                        continue;
                    }

                    ConsumerUID[] consumers = Globals.getStore().
                            getConsumerUIDs(dst, pr.getSysMessageID());
   
                    if (consumers == null) consumers = new ConsumerUID[0];

                    if (consumers.length == 0 &&
                        Globals.getStore().hasMessageBeenAcked(dst, pr.getSysMessageID())) {
                        logger.log(Logger.INFO,
                            Globals.getBrokerResources().getString(
                                BrokerResources.W_TAKEOVER_MSG_ALREADY_ACKED,
                                pr.getSysMessageID()));
                        d.unputMessage(pr, RemoveReason.ACKNOWLEDGED);
                        pr.destroy();
                        pr.unlock();
                        continue;
                    }

                    if (consumers.length > 0) {
                        pr.setStoredWithInterest(true);
                    } else {
                        pr.setStoredWithInterest(false);
                    }

                    int states[] = null;

                    if (consumers.length == 0) {
                        // route the message, it depends on the type of
                        // message
                        try {
                            consumers = d.routeLoadedTransactionMessage(pr);
                        } catch (Exception ex) {
                            logger.log(Logger.INFO,"Internal Error "
                               + "loading/routing transacted message, "
                               + "throwing out message " +
                               pr.getSysMessageID(), ex);
                        }
                        states = new int[consumers.length];
                        for (int i=0; i < states.length; i ++
                            states[i] = Store.INTEREST_STATE_ROUTED;
                        try {
                            Globals.getStore().storeInterestStates(
                                  d.getDestinationUID(),
                                  pr.getSysMessageID(),
                                  consumers, states, true, null);
                            pr.setStoredWithInterest(true);
                        } catch (Exception ex) {
                            // message already routed
                            StringBuffer debuf = new StringBuffer();
                            for (int i = 0; i < consumers.length; i++) {
                                if (i > 0) debuf.append(", ");
                                debuf.append(consumers[i]);
                            }
                            logger.log(logger.WARNING,
                                BrokerResources.W_TAKEOVER_MSG_ALREADY_ROUTED,
                                pr.getSysMessageID(), debuf.toString(), ex);
                        }
                    } else {
                        states = new int[consumers.length];
   
                        for (int i = 0; i < consumers.length; i ++) {
                            states[i] = Globals.getStore().getInterestState(
                                        dst, pr.getSysMessageID(), consumers[i]);
                        }
                    }

                    pr.update(consumers, states, false);

                    // OK deal w/ transsactions
                    // LKS - XXX
                    ExpirationInfo ei = pr.getExpiration();
                    if (ei != null && d.expireReaper != null) {
                        d.expireReaper.addExpiringMessage(ei);
                    }
                    List consumerList = new ArrayList(Arrays.asList(
                                         consumers));

                    // OK ... see if we are in txn
                    Iterator citr = consumerList.iterator();
                    while (citr.hasNext()) {
                        logger.log(Logger.DEBUG," Message "
                             + pr.getSysMessageID() + " has "
                             + consumerList.size() + " consumers ");
                        ConsumerUID cuid = (ConsumerUID)citr.next();
                        String key = pr.getSysMessageID() +
                                    ":" + cuid;
                        TransactionList tl = Globals.getTransactionList();
                        TransactionUID tid = (TransactionUID) ackLookup.get(key);
                        if (DEBUG) {
                        logger.log(logger.INFO, "loadTakeoverMsgs: lookup "+key+" found tid="+tid);
                        }
                        if (tid != null) {
                            boolean remote = false;
                            TransactionState ts = tl.retrieveState(tid);
                            if (ts == null) {
                                ts = tl.getRemoteTransactionState(tid);
                                remote = true;
                            }
                            if (DEBUG) {
                            logger.log(logger.INFO, "tid="+tid+" has state="+
                                       TransactionState.toString(ts.getState()));
                            }
                            if (ts != null &&
                                ts.getState() != TransactionState.ROLLEDBACK &&
                                ts.getState() != TransactionState.COMMITTED) {
                                // in transaction ...
                                if (DEBUG) {
                                    logger.log(Logger.INFO,
                                    "loadTakeoverMsgs: Open transaction ack ["+key +"]"+
                                     (remote?"remote":"")+", TUID="+tid);
                                }
                                if (!remote) {
                                    try {
                                    tl.addAcknowledgement(tid, pr.getSysMessageID(),
                                                          cuid, cuid, true, false);
                                    } catch (TransactionAckExistException e) {

                                    //can happen if takeover tid's remote txn after restart
                                    //then txn ack would have already been loaded
                                    logger.log(Logger.INFO,
                                               Globals.getBrokerResources().getKString(
                                               BrokerResources.I_TAKINGOVER_TXN_ACK_ALREADY_EXIST,
                                                       "["+pr.getSysMessageID()+"]"+cuid+":"+cuid,
                                                       tid+"["+TransactionState.toString(ts.getState())+"]"));

                                    }
                                    tl.addOrphanAck(tid, pr.getSysMessageID(), cuid);

                                }
                                citr.remove();
                                logger.log(Logger.INFO,"Processing open ack " +
                                      pr.getSysMessageID() + ":" + cuid + " on " + tid);
                                continue;
                            } else if (ts != null &&
                                       ts.getState() == TransactionState.COMMITTED) {
                                logger.log(Logger.INFO, "Processing committed ack "+
                                    pr.getSysMessageID() + ":"+cuid + " on " +tid);
                                if (pr.acknowledged(cuid, cuid, false, true)) {
                                    d.unputMessage(pr, RemoveReason.ACKNOWLEDGED);
                                    pr.destroy();
                                    continue;
                                }
                                citr.remove();  
                                continue;
                            }
                        }
                    }
                    // route msgs not in transaction
                    if (DEBUG) {
                    StringBuffer buf = new StringBuffer();
                    ConsumerUID cid = null;
                    for (int j = 0; j <consumerList.size(); j++) {
                        cid = (ConsumerUID)consumerList.get(j);
                        buf.append(cid);
                        buf.append(" ");
                    }
                    logger.log(Logger.INFO, "non-transacted: Routing Message "
                          + pr.getSysMessageID() + " to "
                          + consumerList.size() + " consumers:"+buf.toString());
                    }
                    pr.unlock();
                    d.routeLoadedMessage(pr, consumerList);
                    if (d.destReaper != null) {
                        d.destReaper.cancel();
                        d.destReaper = null;
                    }
View Full Code Here

        }

        msgs = new JMSPacket[ numMsgs ];

        for (int i = 0; i < numMsgs; ++i)  {
      PacketReference pr = d.get((SysMessageID)msgIds.get(i));
      msgs[i] = pr.getPacket();
        }
    }
      } catch (Exception e)  {
          String errStr = "browseMessages: Browse queue failed. Connection ID: "
      + connectionId
View Full Code Here

     */
    public boolean addAcknowledgement(TransactionUID tid,
        SysMessageID sysid, ConsumerUID id, ConsumerUID sid)
        throws BrokerException
    {
        PacketReference pr = Destination.get(sysid);
        if (pr == null) {
            if (!Destination.isLocked(sysid)) {
            throw new BrokerException(Globals.getBrokerResources().getKString(
            BrokerResources.I_ACK_FAILED_MESSAGE_GONE,
            ""+sysid+"["+id+":"+sid+"]TUID="+tid), Status.CONFLICT);
            } else {
            throw new BrokerException(Globals.getBrokerResources().getKString(
            BrokerResources.I_ACK_FAILED_MESSAGE_LOCKED,
            ""+sysid+"["+id+":"+sid+"]TUID="+tid), Status.CONFLICT);
            }
        }
        boolean persist = sid.shouldStore() && pr != null && pr.isPersistent() && pr.isLocal();
        return addAcknowledgement(tid, sysid, id, sid, false, persist);
    }
View Full Code Here

TOP

Related Classes of com.sun.messaging.jmq.jmsserver.core.PacketReference

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.