public void clientDestroyed(Client client) { Destination dest = client .getEndpoint() .getEndpointInfo() .getProperty(DECOUPLED_DESTINATION, Destination.class); if (dest != null) { dest.setMessageObserver(null); dest.shutdown(); } }
/** * @param address the address * @return a Destination for the address */ private Destination getDestination(Bus bus, String address, Message message) throws IOException { Destination destination = null; DestinationFactoryManager factoryManager = bus.getExtension(DestinationFactoryManager.class); DestinationFactory factory = factoryManager.getDestinationFactoryForUri(address); if (factory != null) { Endpoint ep = message.getExchange().getEndpoint(); EndpointInfo ei = new EndpointInfo(); ei.setName( new QName( ep.getEndpointInfo().getName().getNamespaceURI(), ep.getEndpointInfo().getName().getLocalPart() + ".decoupled")); ei.setAddress(address); destination = factory.getDestination(ei, bus); Conduit conduit = ContextUtils.getConduit(null, message); if (conduit != null) { MessageObserver ob = ((Observable) conduit).getMessageObserver(); ob = new InterposedMessageObserver(bus, ob); destination.setMessageObserver(ob); } } return destination; }
@Override public synchronized void addListener(Destination d, Endpoint e) { MessageObserver mo = d.getMessageObserver(); if (d.getAddress() != null && d.getAddress().getAddress() != null && d.getAddress().getAddress().getValue() != null && d.getAddress().getAddress().getValue().startsWith("soap.udp")) { // soap.udp REQUIRES usage of WS-Addressing... we need to turn this on setupUDP(e, e.getEndpointInfo()); } if (mo == null) { super.addListener(d, e); return; } if (mo instanceof ChainInitiationObserver) { ChainInitiationObserver cio = (ChainInitiationObserver) mo; Binding b = e.getBinding(); Binding b2 = cio.getEndpoint().getBinding(); if (b == b2) { // re-registering the same endpoint? return; } Object o = cio.getEndpoint().get("allow-multiplex-endpoint"); if (o instanceof String) { o = Boolean.parseBoolean((String) o); } else if (o == null) { o = Boolean.FALSE; } if (b instanceof org.apache.cxf.binding.soap.SoapBinding && b2 instanceof org.apache.cxf.binding.soap.SoapBinding && ((org.apache.cxf.binding.soap.SoapBinding) b) .getSoapVersion() .equals(((org.apache.cxf.binding.soap.SoapBinding) b2).getSoapVersion()) && Boolean.FALSE.equals(o)) { throw new RuntimeException( "Soap " + ((org.apache.cxf.binding.soap.SoapBinding) b).getSoapVersion().getVersion() + " endpoint already registered on address " + e.getEndpointInfo().getAddress()); } MultipleEndpointObserver newMO = new MultipleEndpointObserver(getBus()) { @Override protected Message createMessage(Message message) { return new SoapMessage(message); } }; newMO.getBindingInterceptors().add(new AttachmentInInterceptor()); newMO.getBindingInterceptors().add(new StaxInInterceptor()); // This will not work if one of the endpoints disables message // processing. But, if you've disabled message processing, you // probably aren't going to use this feature. newMO.getBindingInterceptors().add(new ReadHeadersInterceptor(getBus(), (SoapVersion) null)); newMO.getBindingInterceptors().add(new StartBodyInterceptor()); newMO.getBindingInterceptors().add(new CheckFaultInterceptor()); // Add in a default selection interceptor newMO.getRoutingInterceptors().add(new EndpointSelectionInterceptor()); newMO.getEndpoints().add(cio.getEndpoint()); mo = newMO; } if (mo instanceof MultipleEndpointObserver) { MultipleEndpointObserver meo = (MultipleEndpointObserver) mo; meo.getEndpoints().add(e); } d.setMessageObserver(mo); }