Search in sources :

Example 1 with RMEndpoint

use of org.apache.cxf.ws.rm.RMEndpoint in project cxf by apache.

the class RetransmissionQueueImpl method cacheUnacknowledged.

/**
 * Accepts a new resend candidate.
 *
 * @param ctx the message context.
 * @return ResendCandidate
 */
protected ResendCandidate cacheUnacknowledged(Message message) {
    RMProperties rmps = RMContextUtils.retrieveRMProperties(message, true);
    SequenceType st = rmps.getSequence();
    Identifier sid = st.getIdentifier();
    String key = sid.getValue();
    ResendCandidate candidate = null;
    synchronized (this) {
        List<ResendCandidate> sequenceCandidates = getSequenceCandidates(key);
        if (null == sequenceCandidates) {
            sequenceCandidates = new ArrayList<>();
            candidates.put(key, sequenceCandidates);
        }
        candidate = createResendCandidate(message);
        if (isSequenceSuspended(key)) {
            candidate.suspend();
        }
        sequenceCandidates.add(candidate);
        unacknowledgedCount++;
    }
    LOG.fine("Cached unacknowledged message.");
    try {
        RMEndpoint rme = manager.getReliableEndpoint(message);
        rme.handleAccept(key, st.getMessageNumber(), message);
    } catch (RMException e) {
        LOG.log(Level.WARNING, "Could not find reliable endpoint for message");
    }
    return candidate;
}
Also used : Identifier(org.apache.cxf.ws.rm.v200702.Identifier) SequenceType(org.apache.cxf.ws.rm.v200702.SequenceType) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) RMProperties(org.apache.cxf.ws.rm.RMProperties) RMException(org.apache.cxf.ws.rm.RMException)

Example 2 with RMEndpoint

use of org.apache.cxf.ws.rm.RMEndpoint in project cxf by apache.

the class RMSoapInInterceptor method updateServiceModelInfo.

/**
 * When invoked inbound, check if the action indicates that this is one of the
 * RM protocol messages (CreateSequence, CreateSequenceResponse, TerminateSequence)
 * and if so, replace references to the application service model with references to
 * the RM service model.
 * The addressing protocol handler must have extracted the action beforehand.
 * @see org.apache.cxf.transport.ChainInitiationObserver
 *
 * @param message the message
 */
private void updateServiceModelInfo(SoapMessage message) throws Fault {
    AddressingProperties maps = ContextUtils.retrieveMAPs(message, false, false, false);
    AttributedURIType actionURI = null == maps ? null : maps.getAction();
    String action = null == actionURI ? null : actionURI.getValue().trim();
    LOG.fine("action: " + action);
    RMConstants consts;
    if (RM10Constants.ACTIONS.contains(action)) {
        consts = RM10Constants.INSTANCE;
    } else if (RM11Constants.ACTIONS.contains(action)) {
        consts = RM11Constants.INSTANCE;
    } else {
        return;
    }
    RMProperties rmps = RMContextUtils.retrieveRMProperties(message, false);
    rmps.exposeAs(consts.getWSRMNamespace());
    ProtocolVariation protocol = ProtocolVariation.findVariant(consts.getWSRMNamespace(), maps.getNamespaceURI());
    LOG.info("Updating service model info in exchange");
    RMManager manager = getManager(message);
    assert manager != null;
    RMEndpoint rme = null;
    try {
        rme = manager.getReliableEndpoint(message);
    } catch (RMException e) {
        throw new SoapFault(new org.apache.cxf.common.i18n.Message("CANNOT_PROCESS", LOG), e, message.getVersion().getSender());
    }
    Exchange exchange = message.getExchange();
    Endpoint ep = rme.getEndpoint(protocol);
    exchange.put(Endpoint.class, ep);
    exchange.put(Service.class, ep.getService());
    exchange.put(Binding.class, ep.getBinding());
    // Also set BindingOperationInfo as some operations (SequenceAcknowledgment) have
    // neither in nor out messages, and thus the WrappedInInterceptor cannot
    // determine the operation name.
    BindingInfo bi = ep.getEndpointInfo().getBinding();
    BindingOperationInfo boi = null;
    boolean isOneway = true;
    if (consts.getCreateSequenceAction().equals(action)) {
        if (RMContextUtils.isServerSide(message)) {
            boi = bi.getOperation(consts.getCreateSequenceOperationName());
            isOneway = false;
        } else {
            boi = bi.getOperation(consts.getCreateSequenceOnewayOperationName());
        }
    } else if (consts.getCreateSequenceResponseAction().equals(action)) {
        if (RMContextUtils.isServerSide(message)) {
            boi = bi.getOperation(consts.getCreateSequenceResponseOnewayOperationName());
        } else {
            boi = bi.getOperation(consts.getCreateSequenceOperationName());
            isOneway = false;
        }
    } else if (consts.getSequenceAckAction().equals(action)) {
        boi = bi.getOperation(consts.getSequenceAckOperationName());
    } else if (consts.getAckRequestedAction().equals(action)) {
        boi = bi.getOperation(consts.getAckRequestedOperationName());
    } else if (consts.getTerminateSequenceAction().equals(action)) {
        boi = bi.getOperation(consts.getTerminateSequenceOperationName());
    } else if (RM11Constants.INSTANCE.getTerminateSequenceResponseAction().equals(action)) {
        // TODO add server-side TSR handling
        boi = bi.getOperation(RM11Constants.INSTANCE.getTerminateSequenceOperationName());
        isOneway = false;
    } else if (consts.getCloseSequenceAction().equals(action)) {
        boi = bi.getOperation(consts.getCloseSequenceOperationName());
    } else if (RM11Constants.INSTANCE.getCloseSequenceResponseAction().equals(action)) {
        boi = bi.getOperation(RM11Constants.INSTANCE.getCloseSequenceOperationName());
        isOneway = false;
    }
    // make sure the binding information has been set
    if (boi == null) {
        LOG.fine("No BindingInfo for action " + action);
    } else {
        exchange.put(BindingOperationInfo.class, boi);
        exchange.setOneWay(isOneway);
    }
    if (!consts.getCreateSequenceResponseAction().equals(action) && !consts.getSequenceAckAction().equals(action) && !RM11Constants.INSTANCE.getTerminateSequenceResponseAction().equals(action) && !RM11Constants.INSTANCE.getCloseSequenceResponseAction().equals(action)) {
        LOG.fine("Changing requestor role from " + message.get(Message.REQUESTOR_ROLE) + " to false");
        Object originalRequestorRole = message.get(Message.REQUESTOR_ROLE);
        if (null != originalRequestorRole) {
            message.put(RMMessageConstants.ORIGINAL_REQUESTOR_ROLE, originalRequestorRole);
        }
        message.put(Message.REQUESTOR_ROLE, Boolean.FALSE);
    }
    // replace WrappedInInterceptor with BareInInterceptor if necessary
    // as RM protocol messages use parameter style BARE
    InterceptorChain chain = message.getInterceptorChain();
    ListIterator<Interceptor<? extends Message>> it = chain.getIterator();
    boolean bareIn = false;
    boolean wrappedIn = false;
    while (it.hasNext() && !wrappedIn && !bareIn) {
        PhaseInterceptor<? extends Message> pi = (PhaseInterceptor<? extends Message>) it.next();
        if (BareInInterceptor.class.getName().equals(pi.getId())) {
            bareIn = true;
        }
    }
    if (!bareIn) {
        chain.add(new BareInInterceptor());
        LOG.fine("Added BareInInterceptor to chain.");
    }
}
Also used : SoapFault(org.apache.cxf.binding.soap.SoapFault) BindingOperationInfo(org.apache.cxf.service.model.BindingOperationInfo) SoapMessage(org.apache.cxf.binding.soap.SoapMessage) Message(org.apache.cxf.message.Message) PhaseInterceptor(org.apache.cxf.phase.PhaseInterceptor) AttributedURIType(org.apache.cxf.ws.addressing.AttributedURIType) RMConstants(org.apache.cxf.ws.rm.RMConstants) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) RMException(org.apache.cxf.ws.rm.RMException) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) Endpoint(org.apache.cxf.endpoint.Endpoint) RMManager(org.apache.cxf.ws.rm.RMManager) BindingInfo(org.apache.cxf.service.model.BindingInfo) AddressingProperties(org.apache.cxf.ws.addressing.AddressingProperties) AbstractRMInterceptor(org.apache.cxf.ws.rm.AbstractRMInterceptor) AbstractSoapInterceptor(org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor) BareInInterceptor(org.apache.cxf.wsdl.interceptors.BareInInterceptor) Interceptor(org.apache.cxf.interceptor.Interceptor) PhaseInterceptor(org.apache.cxf.phase.PhaseInterceptor) RMProperties(org.apache.cxf.ws.rm.RMProperties) BareInInterceptor(org.apache.cxf.wsdl.interceptors.BareInInterceptor) ProtocolVariation(org.apache.cxf.ws.rm.ProtocolVariation) Exchange(org.apache.cxf.message.Exchange) InterceptorChain(org.apache.cxf.interceptor.InterceptorChain)

Example 3 with RMEndpoint

use of org.apache.cxf.ws.rm.RMEndpoint in project cxf by apache.

the class SequenceTimeoutTest method testTimeout.

@Test
public void testTimeout() throws Exception {
    init("org/apache/cxf/systest/ws/rm/rminterceptors.xml", true, true);
    List<Dispatch<DOMSource>> dispatches = new ArrayList<>(5);
    int count = 5;
    for (int x = 0; x < count; x++) {
        Dispatch<DOMSource> dispatch = initDispatch();
        AcksPolicyType ap = new AcksPolicyType();
        // don't send the acks to cause a memory leak - CXF-7096
        ap.setImmediaAcksTimeout(500000L);
        greeterBus.getExtension(RMManager.class).getDestinationPolicy().setAcksPolicy(ap);
        dispatch.invoke(getDOMRequest("One"));
        dispatches.add(dispatch);
    }
    RMEndpoint ep = rmManager.findReliableEndpoint(GREETME_SERVICE_NAME);
    Assert.assertNotNull(ep);
    Assert.assertEquals(count, ep.getDestination().getAllSequences().size());
    Assert.assertEquals(count, ep.getSource().getAllSequences().size());
    Thread.sleep(2500);
    System.gc();
    Assert.assertEquals(0, ep.getDestination().getAllSequences().size());
    Assert.assertEquals(0, ep.getSource().getAllSequences().size());
    try {
        dispatches.get(0).invoke(getDOMRequest("One"));
        fail("The sequence should have been terminated");
    } catch (Throwable t) {
        // expected
        Assert.assertTrue(t.getMessage().contains("not a known Sequence identifier"));
    }
    rmManager.getStore();
}
Also used : DOMSource(javax.xml.transform.dom.DOMSource) AcksPolicyType(org.apache.cxf.ws.rm.manager.AcksPolicyType) ArrayList(java.util.ArrayList) Dispatch(javax.xml.ws.Dispatch) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) Endpoint(javax.xml.ws.Endpoint) Test(org.junit.Test)

Example 4 with RMEndpoint

use of org.apache.cxf.ws.rm.RMEndpoint in project cxf by apache.

the class RetransmissionQueueImpl method purgeCandidates.

private void purgeCandidates(SourceSequence seq, boolean any) {
    Collection<Long> purged = new ArrayList<>();
    Collection<ResendCandidate> resends = new ArrayList<>();
    Identifier sid = seq.getIdentifier();
    synchronized (this) {
        LOG.fine("Start purging resend candidates.");
        List<ResendCandidate> sequenceCandidates = getSequenceCandidates(seq);
        if (null != sequenceCandidates) {
            for (int i = sequenceCandidates.size() - 1; i >= 0; i--) {
                ResendCandidate candidate = sequenceCandidates.get(i);
                long m = candidate.getNumber();
                if (any || seq.isAcknowledged(m)) {
                    sequenceCandidates.remove(i);
                    candidate.resolved();
                    unacknowledgedCount--;
                    purged.add(m);
                    resends.add(candidate);
                }
            }
            if (sequenceCandidates.isEmpty()) {
                candidates.remove(sid.getValue());
            }
        }
        LOG.fine("Completed purging resend candidates.");
    }
    if (!purged.isEmpty()) {
        RMStore store = manager.getStore();
        if (null != store) {
            store.removeMessages(sid, purged, true);
        }
        RMEndpoint rmEndpoint = seq.getSource().getReliableEndpoint();
        for (ResendCandidate resend : resends) {
            rmEndpoint.handleAcknowledgment(sid.getValue(), resend.getNumber(), resend.getMessage());
        }
    }
}
Also used : Identifier(org.apache.cxf.ws.rm.v200702.Identifier) ArrayList(java.util.ArrayList) RMStore(org.apache.cxf.ws.rm.persistence.RMStore) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) RMEndpoint(org.apache.cxf.ws.rm.RMEndpoint) Endpoint(org.apache.cxf.endpoint.Endpoint)

Aggregations

RMEndpoint (org.apache.cxf.ws.rm.RMEndpoint)4 ArrayList (java.util.ArrayList)2 Endpoint (org.apache.cxf.endpoint.Endpoint)2 RMException (org.apache.cxf.ws.rm.RMException)2 RMProperties (org.apache.cxf.ws.rm.RMProperties)2 Identifier (org.apache.cxf.ws.rm.v200702.Identifier)2 DOMSource (javax.xml.transform.dom.DOMSource)1 Dispatch (javax.xml.ws.Dispatch)1 Endpoint (javax.xml.ws.Endpoint)1 SoapFault (org.apache.cxf.binding.soap.SoapFault)1 SoapMessage (org.apache.cxf.binding.soap.SoapMessage)1 AbstractSoapInterceptor (org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor)1 Interceptor (org.apache.cxf.interceptor.Interceptor)1 InterceptorChain (org.apache.cxf.interceptor.InterceptorChain)1 Exchange (org.apache.cxf.message.Exchange)1 Message (org.apache.cxf.message.Message)1 PhaseInterceptor (org.apache.cxf.phase.PhaseInterceptor)1 BindingInfo (org.apache.cxf.service.model.BindingInfo)1 BindingOperationInfo (org.apache.cxf.service.model.BindingOperationInfo)1 AddressingProperties (org.apache.cxf.ws.addressing.AddressingProperties)1