public String send( final T message, final Message correlatedMessage, final String correlationId, final URI dvbEndpointSelector, final String jmsGroupId, final Destination replyQueue) { try { final M jmsMessage = this.messageHandler.createEmptyMessage(this.sessionDelegate); jmsMessage.setJMSCorrelationID(determineCorrelationId(correlationId, correlatedMessage)); Destination replyTo = replyQueue == null ? this.defaultReplyDestinationDelegate.delegate() : replyQueue; if (replyTo != null) { jmsMessage.setJMSReplyTo(replyTo); } final URI temp = DataUtilities.coalesce(dvbEndpointSelector, this.defaultEndpoint); if (temp != null) { jmsMessage.setStringProperty( JMSMessageSender.ENDPOINT_NAMESPACE, dvbEndpointSelector.toASCIIString()); } if (correlatedMessage != null && this.copyPropertyPattern != null) { //noinspection unchecked for (final String name : Collections.list((Enumeration<String>) correlatedMessage.getPropertyNames())) { if (this.copyPropertyPattern.matcher(name).matches()) { if (correlatedMessage.getStringProperty(name) != null) { jmsMessage.setStringProperty(name, correlatedMessage.getStringProperty(name)); } else { jmsMessage.setObjectProperty(name, correlatedMessage.getObjectProperty(name)); } } } } this.messageHandler.fillMessage(message, jmsMessage); if (jmsGroupId != null) { jmsMessage.setStringProperty(JMSMessageSender.JMSX_GROUP_ID, jmsGroupId); } Delegate<MessageProducer> producer = this.producerDelegate; if (correlatedMessage != null && correlatedMessage.getJMSReplyTo() != null) { producer = new JMSMessageProducerDelegate( sessionDelegate, new UnmodifiableDelegate<>(correlatedMessage.getJMSReplyTo())); } producer.delegate().send(jmsMessage); return jmsMessage.getJMSMessageID(); } catch (final JMSException e) { throw DelegatedException.delegate(e); } }