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);
  }