Package org.apache.sandesha2.storage.beans

Examples of org.apache.sandesha2.storage.beans.SenderBean


         (makeConnection == null || !makeConnection.booleanValue()) &&
         (t == null || !t.getStatus().equals(RequestResponseTransportStatus.WAITING))) {
       
        // Mark this sender bean so that we know that the transport is unavailable, if the
        // bean is still stored.
        SenderBean bean = senderBeanMgr.retrieve(senderBean.getMessageID());
        if(bean != null && bean.isTransportAvailable()) {
          bean.setTransportAvailable(false);
          senderBeanMgr.update(bean);
        }
       
        // Commit the update
        if(transaction != null && transaction.isActive()) transaction.commit();
        transaction = null;
       
        if (log.isDebugEnabled())
          log.debug("Exit: SenderWorker::run, no response transport for anonymous message");
        return;
      }
     
      int messageType = senderBean.getMessageType();
     
      if (isAckPiggybackableMsgType(messageType)) {
        // Commit the update
        if(transaction != null && transaction.isActive()) transaction.commit();
        transaction = storageManager.getTransaction();

        // Piggyback ack messages based on the 'To' address of the message
        AcknowledgementManager.piggybackAcksIfPresent(rmMsgCtx, storageManager);
      }
      if (transaction != null && transaction.isActive())
        transaction.commit();     
     
      transaction = storageManager.getTransaction();

      /*Removing the sending of AckRequested msgs as has performance impact.
        It could be rewritten to send AckRequested headers infrequantly and
        hence be less of a performance impact.  Functionally it
        may be required to interop with other implementations but until
        the problem occurs it's best not to do it at all and keep performance
        as optimal as possible
      //If this is an application msg we need to add an ackRequest to the header   
      if(messageType == Sandesha2Constants.MessageTypes.APPLICATION){       
        //Add an ackRequest       
        RMSBean rmsBean = SandeshaUtil.getRMSBeanFromSequenceId(storageManager, senderBean.getSequenceID());       
        RMMsgCreator.addAckRequest(rmMsgCtx, senderBean.getSequenceID(), rmsBean);               
        if (transaction != null && transaction.isActive())          
          transaction.commit();
       
        transaction = storageManager.getTransaction();     
      } */
     
      //if this is a sync RM exchange protocol we always have to add an ack
      boolean ackPresent = false;
      Iterator it = rmMsgCtx.getSequenceAcknowledgements();
      if (it.hasNext())
        ackPresent = true;
     
      if (!ackPresent && toEPR.hasAnonymousAddress()
          && rmMsgCtx.getMessageContext().isServerSide()
          &&
        (messageType==Sandesha2Constants.MessageTypes.APPLICATION ||
           messageType==Sandesha2Constants.MessageTypes.UNKNOWN ||
           messageType==Sandesha2Constants.MessageTypes.LAST_MESSAGE)) {
       
        String inboundSequenceId = senderBean.getInboundSequenceId();
        if (inboundSequenceId==null)
          throw new SandeshaException ("InboundSequenceID is not set for the sequence:" + senderBean.getSequenceID());
       
        RMDBean incomingSequenceBean = SandeshaUtil.getRMDBeanFromSequenceId(storageManager, inboundSequenceId);

        if (incomingSequenceBean!=null)
          RMMsgCreator.addAckMessage(rmMsgCtx, inboundSequenceId, incomingSequenceBean, false, true);
      }

      if (transaction != null && transaction.isActive())
        transaction.commit();     
     
      transaction = storageManager.getTransaction();
     
      senderBean = updateMessage(rmMsgCtx,senderBean,storageManager);

      if (senderBean == null) {
        if (log.isDebugEnabled())
          log.debug("Exit: SenderWorker::run, !continueSending");
       
        if(transaction != null && transaction.isActive()) {
          transaction.rollback();
          transaction = null;
        }
       
        return;
      }

      // Although not actually sent yet, update the send count to indicate an attempt
      if (senderBean.isReSend()) {
        senderBeanMgr.update(senderBean);
      }

      // sending the message
      boolean successfullySent = false;
     
      // No need to redecorate application messages ... only for rm protocol messages
      if(Sandesha2Constants.MessageTypes.APPLICATION!=senderBean.getMessageType()){
        //try to redecorate the EPR if necessary
        if (log.isDebugEnabled())
          log.debug("Redecorate EPR : " + msgCtx.getEnvelope().getHeader());
        EndpointReference replyToEPR = msgCtx.getReplyTo();
        if(replyToEPR!=null){
          replyToEPR = SandeshaUtil.getEPRDecorator(msgCtx.getConfigurationContext()).decorateEndpointReference(replyToEPR);
          msgCtx.setReplyTo(replyToEPR);
        }
      }
      // have to commit the transaction before sending. This may
      // get changed when WS-AT is available.
      if(transaction != null) {
        transaction.commit();
        transaction = null;
      }

      boolean processResponseForFaults = false;
      try {
        InvocationResponse response = InvocationResponse.CONTINUE;
       
        if(storageManager.requiresMessageSerialization()) {
          if(msgCtx.isPaused()) {
            if (log.isDebugEnabled())
              log.debug("Resuming a send for message : " + msgCtx.getEnvelope().getHeader());
            msgCtx.setPaused(false);
            msgCtx.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.FALSE);
            response = AxisEngine.resumeSend(msgCtx);
          } else {
            if (log.isDebugEnabled())
              log.debug("Sending a message : " + msgCtx.getEnvelope().getHeader());
            msgCtx.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.FALSE);
            AxisEngine.send(msgCtx)// TODO check if this should return an invocation response
          }
        } else {
 
          ArrayList<Handler> retransmittablePhases = (ArrayList<Handler>) msgCtx.getProperty(Sandesha2Constants.RETRANSMITTABLE_PHASES);
          if (retransmittablePhases!=null) {
            msgCtx.setExecutionChain(retransmittablePhases);
          } else {
            ArrayList<Handler> emptyExecutionChain = new ArrayList<Handler>();
            msgCtx.setExecutionChain(emptyExecutionChain);
          }
         
          msgCtx.setCurrentHandlerIndex(0);
          msgCtx.setCurrentPhaseIndex(0);
          msgCtx.setPaused(false);
       
          if (log.isDebugEnabled())
            log.debug("Resuming a send for message : " + msgCtx.getEnvelope().getHeader());
              msgCtx.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.FALSE);
          response = AxisEngine.resumeSend(msgCtx);
        }
        if(log.isDebugEnabled()) log.debug("Engine resume returned " + response);
        if(response != InvocationResponse.SUSPEND) {
          if(t != null) {
            if(log.isDebugEnabled()) log.debug("Signalling transport in " + t);
            t.signalResponseReady();
          }
        }
       
        successfullySent = true;
       
      } catch (AxisFault e) {
        //this is a possible SOAP 1.2 Fault. So letting it proceed.
       
        processResponseForFaults = true;
       
        recordError(e, rmMsgCtx, storageManager);
       
      } catch (Exception e) {
        String message = SandeshaMessageHelper.getMessage(
            SandeshaMessageKeys.sendMsgError, e.toString());
       
        if (log.isDebugEnabled())
          log.debug(message, e);
       
        recordError(e, rmMsgCtx, storageManager);
       
      }
      // Establish the transaction for post-send processing
      transaction = storageManager.getTransaction();

      // update or delete only if the object is still present.
      SenderBean bean1 = senderBeanMgr
          .retrieve(senderBean.getMessageID());
      if (bean1 != null) {
        if (senderBean.isReSend()) {
          bean1.setTimeToSend(senderBean.getTimeToSend());
          senderBeanMgr.update(bean1);
        } else {
          senderBeanMgr.delete(bean1.getMessageID());

          // removing the message from the storage.
          String messageStoredKey = bean1.getMessageContextRefKey();
          storageManager.removeMessageContext(messageStoredKey);
        }
      }

      // Commit the transaction to release the SenderBean
View Full Code Here


    }

    public void testDelete() throws SandeshaStorageException {
        assertNull(mgr.retrieve(""));
        try {
            mgr.insert(new SenderBean("MsgId1", "Key1", false , 1001 , "TmpSeqId1", 1001));
        } catch (Exception ex) {
            fail("should not throw an exception");
        }
        assertNotNull(mgr.retrieve("MsgId1"));
    }
View Full Code Here

        assertNotNull(mgr.retrieve("MsgId1"));
    }

    public void testFind() throws SandeshaStorageException {
        try {
            mgr.insert(new SenderBean("MsgId2", "Key2", false , 1001 , "TmpSeqId2", 1002));
            mgr.insert(new SenderBean("MsgId3", "Key3", false , 1001 , "TmpSeqId2", 1003));

            SenderBean target = new SenderBean();
            target.setInternalSequenceID("TmpSeqId2");

            Iterator iterator = mgr.find(target).iterator();
            SenderBean tmp = (SenderBean) iterator.next();

            if (tmp.getMessageID().equals("MsgId2")) {
                tmp = (SenderBean) iterator.next();
                assertTrue(tmp.getMessageID().equals("MsgId3"));
            } else {
                tmp = (SenderBean) iterator.next();
                assertTrue(tmp.getMessageID().equals("MsgId2"));
            }


        } catch (SandeshaException e) {
            fail("should not throw an exception");
View Full Code Here

//
//        } catch (SandeshaException ex) {
//        }

        try {
            mgr.insert(new SenderBean("MsgId4","Key4", false , 1001 , "TmpSeqId4", 1004));
            SenderBean tmp = mgr.retrieve("MsgId4");
            assertTrue(tmp.getMessageContextRefKey().equals("Key4"));


        } catch (SandeshaException e) {
            fail("should not throw an exception");
        }
View Full Code Here

    }

    public void testRetrieve() throws SandeshaStorageException {
        assertNull(mgr.retrieve("MsgId5"));
        try {
            mgr.insert(new SenderBean("MsgId5", "Key5", false , 1001 , "TmpSeqId5", 1005));
        } catch (SandeshaException e) {
            fail("this should not throw an exception");
        }
        assertNotNull(mgr.retrieve("MsgId5"));
    }
View Full Code Here

        }
        assertNotNull(mgr.retrieve("MsgId5"));
    }

    public void testUpdate() throws SandeshaStorageException {
        SenderBean bean = new SenderBean("MsgId6", "Key6", false , 1001 , "TmpSeqId6", 1006);
        try {
            mgr.insert(bean);
        } catch (SandeshaException e) {
            fail("should not throw an exception");
        }
        bean.setSend(true);
        mgr.update(bean);

        SenderBean tmp = mgr.retrieve("MsgId6");
        assertTrue(tmp.isSend());
    }
View Full Code Here

        }

        Transaction pickMessagesToSendTransaction = storageManager.getTransaction();

        SenderBeanMgr mgr = storageManager.getRetransmitterBeanMgr();
        SenderBean senderBean = mgr.getNextMsgToSend();
        if (senderBean==null) {
          pickMessagesToSendTransaction.commit();
          continue;
          }
       

        MessageRetransmissionAdjuster retransmitterAdjuster = new MessageRetransmissionAdjuster();
        boolean continueSending = retransmitterAdjuster.adjustRetransmittion(senderBean, context);
        if (!continueSending)
          continue;
       
        pickMessagesToSendTransaction.commit();
       
        String key = (String) senderBean.getMessageContextRefKey();
        MessageContext msgCtx = storageManager.retrieveMessageContext(key, context);

        if (msgCtx == null) {
          String message = "Message context is not present in the storage";
        }

        // sender will not send the message if following property is
        // set and not true.
        // But it will set if it is not set (null)

        // This is used to make sure that the mesage get passed the Sandesha2TransportSender.

        String qualifiedForSending = (String) msgCtx.getProperty(Sandesha2Constants.QUALIFIED_FOR_SENDING);
        if (qualifiedForSending != null && !qualifiedForSending.equals(Sandesha2Constants.VALUE_TRUE)) {
          continue;
        }

        if (msgCtx == null) {
          log.debug("ERROR: Sender has an Unavailable Message entry");
          break;
        }

        RMMsgContext rmMsgCtx = MsgInitializer.initializeMessage(msgCtx);

        //operation is the lowest level Sandesha2 should be attached
        ArrayList msgsNotToSend = SandeshaUtil.getPropertyBean(msgCtx.getAxisOperation()).getMsgTypesToDrop();

        if (msgsNotToSend != null && msgsNotToSend.contains(new Integer(rmMsgCtx.getMessageType()))) {
          continue;
        }
       
        updateMessage(msgCtx);

        Transaction preSendTransaction = storageManager.getTransaction();

        int messageType = rmMsgCtx.getMessageType();
        if (messageType == Sandesha2Constants.MessageTypes.APPLICATION) {
          Sequence sequence = (Sequence) rmMsgCtx.getMessagePart(Sandesha2Constants.MessageParts.SEQUENCE);
          String sequenceID = sequence.getIdentifier().getIdentifier();
 
        }
       
        //checking weather this message can carry piggybacked acks
        if (isAckPiggybackableMsgType(messageType) && !isAckAlreadyPiggybacked(rmMsgCtx)) {
          // piggybacking if an ack if available for the same sequence.
          //TODO do piggybacking based on wsa:To
          AcknowledgementManager.piggybackAcksIfPresent(rmMsgCtx);
        }
       
        preSendTransaction.commit();
       
        //sending the message
        TransportOutDescription transportOutDescription = msgCtx.getTransportOut();
        TransportSender transportSender = transportOutDescription.getSender();
         
        boolean successfullySent = false;
        if (transportSender != null) {
          try {
           
            //TODO change this to cater for security.
            transportSender.invoke(msgCtx);
            successfullySent = true;
          } catch (AxisFault e) {
            // TODO Auto-generated catch block
              log.debug("Could not send message");
            log.debug(e.getStackTrace().toString());
          }
        }

        Transaction postSendTransaction = storageManager.getTransaction();

        // update or delete only if the object is still present.
        SenderBean bean1 = mgr.retrieve(senderBean.getMessageID());
        if (bean1 != null) {
          if (senderBean.isReSend()) {
            bean1.setSentCount(senderBean.getSentCount());
            bean1.setTimeToSend(senderBean.getTimeToSend());
            mgr.update(bean1);
          } else
            mgr.delete(bean1.getMessageID());
        }

        postSendTransaction.commit(); // commiting the current transaction

        if (successfullySent) {
View Full Code Here

      return arrayList;
   
    Iterator iterator = table.keySet().iterator();
   
    while (iterator.hasNext()) {
      SenderBean senderBean = (SenderBean) table.get(iterator.next());
      if (internalSequenceID.equals(senderBean.getInternalSequenceID()))
          arrayList.add(senderBean);
    }
   
    return arrayList;
  }
View Full Code Here

  public synchronized Collection find(SenderBean bean) {
    ArrayList beans = new ArrayList();
    Iterator iterator = ((Hashtable) table).values().iterator();

    SenderBean temp;
    while (iterator.hasNext()) {

      temp = (SenderBean) iterator.next();

      boolean add = true;

      if (bean.getMessageContextRefKey() != null && !bean.getMessageContextRefKey().equals(temp.getMessageContextRefKey()))
        add = false;

      if (bean.getTimeToSend() > 0
          && bean.getTimeToSend() != temp.getTimeToSend())
        add = false;

      if (bean.getMessageID() != null
          && !bean.getMessageID().equals(temp.getMessageID()))
        add = false;

      if (bean.getInternalSequenceID() != null
          && !bean.getInternalSequenceID().equals(
              temp.getInternalSequenceID()))
        add = false;

      if (bean.getMessageNumber() > 0
          && bean.getMessageNumber() != temp.getMessageNumber())
        add = false;

      if (bean.getMessageType() != Sandesha2Constants.MessageTypes.UNKNOWN
          && bean.getMessageType() != temp.getMessageType())
        add = false;
     
      if (bean.isSend() != temp.isSend())
        add = false;

      if (bean.isReSend() != temp.isReSend())
        add = false;
     
      if (add)
        beans.add(temp);
    }
View Full Code Here

    Iterator iterator = table.keySet().iterator();

    long lowestAppMsgNo = 0;
    while (iterator.hasNext()) {
      Object key = iterator.next();
      SenderBean temp = (SenderBean) table.get(key);
      if (temp.isSend()) {
        long timeToSend = temp.getTimeToSend();
        long timeNow = System.currentTimeMillis();
        if ((timeNow >= timeToSend)) {
          if (temp.getMessageType()==Sandesha2Constants.MessageTypes.APPLICATION) {
            long msgNo = temp.getMessageNumber();
            if (lowestAppMsgNo==0) {
              lowestAppMsgNo=msgNo;
            }else {
              if (msgNo<lowestAppMsgNo)
                lowestAppMsgNo = msgNo;
            }
          }
        }
      }
    }
   
    iterator = table.keySet().iterator()
    while (iterator.hasNext()) {
      Object key = iterator.next();
      SenderBean temp = (SenderBean) table.get(key);

      if (temp.isSend()) {

        long timeToSend = temp.getTimeToSend();
        long timeNow = System.currentTimeMillis();
        if ((timeNow >= timeToSend)) {
          boolean valid = false;
          if (temp.getMessageType()==Sandesha2Constants.MessageTypes.APPLICATION) {
            if (temp.getMessageNumber()==lowestAppMsgNo)
              valid = true;
          }else {
            valid = true;
          }
         
View Full Code Here

TOP

Related Classes of org.apache.sandesha2.storage.beans.SenderBean

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.