Example #1
0
  private void recoverSourceSequence(
      Endpoint endpoint, Conduit conduit, Source s, SourceSequence ss) {
    Collection<RMMessage> ms = store.getMessages(ss.getIdentifier(), true);
    if (null == ms || 0 == ms.size()) {
      store.removeSourceSequence(ss.getIdentifier());
      return;
    }
    LOG.log(Level.FINE, "Number of messages in sequence: {0}", ms.size());

    s.addSequence(ss, false);
    // choosing an arbitrary valid source sequence as the current source sequence
    if (s.getAssociatedSequence(null) == null && !ss.isExpired() && !ss.isLastMessage()) {
      s.setCurrent(ss);
    }
    for (RMMessage m : ms) {

      Message message = new MessageImpl();
      Exchange exchange = new ExchangeImpl();
      message.setExchange(exchange);
      exchange.setOutMessage(message);
      if (null != conduit) {
        exchange.setConduit(conduit);
        message.put(Message.REQUESTOR_ROLE, Boolean.TRUE);
      }
      exchange.put(Endpoint.class, endpoint);
      exchange.put(Service.class, endpoint.getService());
      exchange.put(Binding.class, endpoint.getBinding());
      exchange.put(Bus.class, bus);

      SequenceType st = new SequenceType();
      st.setIdentifier(ss.getIdentifier());
      st.setMessageNumber(m.getMessageNumber());
      RMProperties rmps = new RMProperties();
      rmps.setSequence(st);
      rmps.exposeAs(ss.getProtocol().getWSRMNamespace());
      if (ss.isLastMessage() && ss.getCurrentMessageNr() == m.getMessageNumber()) {
        CloseSequenceType close = new CloseSequenceType();
        close.setIdentifier(ss.getIdentifier());
        rmps.setCloseSequence(close);
      }
      RMContextUtils.storeRMProperties(message, rmps, true);
      if (null == conduit) {
        String to = m.getTo();
        AddressingProperties maps = new AddressingProperties();
        maps.setTo(RMUtils.createReference(to));
        RMContextUtils.storeMAPs(maps, message, true, false);
      }

      try {
        // RMMessage is stored in a serialized way, therefore
        // RMMessage content must be splitted into soap root message
        // and attachments
        PersistenceUtils.decodeRMContent(m, message);
        RMContextUtils.setProtocolVariation(message, ss.getProtocol());
        retransmissionQueue.addUnacknowledged(message);
      } catch (IOException e) {
        LOG.log(Level.SEVERE, "Error reading persisted message data", e);
      }
    }
  }
Example #2
0
  void recoverReliableEndpoint(Endpoint endpoint, Conduit conduit) {
    if (null == store || null == retransmissionQueue) {
      return;
    }

    String id = RMUtils.getEndpointIdentifier(endpoint, getBus());

    Collection<SourceSequence> sss = store.getSourceSequences(id);
    Collection<DestinationSequence> dss = store.getDestinationSequences(id);
    if ((null == sss || 0 == sss.size()) && (null == dss || 0 == dss.size())) {
      return;
    }
    LOG.log(Level.FINE, "Number of source sequences: {0}", sss.size());
    LOG.log(Level.FINE, "Number of destination sequences: {0}", dss.size());

    LOG.log(
        Level.FINE,
        "Recovering {0} endpoint with id: {1}",
        new Object[] {null == conduit ? "client" : "server", id});
    RMEndpoint rme = createReliableEndpoint(endpoint);
    rme.initialise(getConfiguration(), conduit, null, null, null);
    synchronized (reliableEndpoints) {
      reliableEndpoints.put(endpoint, rme);
    }
    for (SourceSequence ss : sss) {
      recoverSourceSequence(endpoint, conduit, rme.getSource(), ss);
    }

    for (DestinationSequence ds : dss) {
      reconverDestinationSequence(endpoint, conduit, rme.getDestination(), ds);
    }
    retransmissionQueue.start();
  }