/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.communication.transport.jms.common; import javax.jms.Connection; import javax.jms.JMSException; import de.rcenvironment.core.communication.channel.MessageChannelState; import de.rcenvironment.core.communication.channel.ServerContactPoint; import de.rcenvironment.core.communication.common.InstanceNodeSessionId; /** * Represents a remote-initiated connection, ie a logical connection that was triggered by a network-level connection by a remote node to * the local node. It allows the local node to actively send messages to that node without requiring the remote node to provide a * {@link ServerContactPoint}, or from the network perspective, listen on any port. * * @author Robert Mischke * */ public class RemoteInitiatedJmsMessageChannel extends AbstractJmsMessageChannel { /** * @param localNodeId * @param connection an already-started JMS connection; expected to be managed externally, ie this class will never attempt to close it * @param associatedSCP * @throws JMSException */ public RemoteInitiatedJmsMessageChannel(InstanceNodeSessionId localNodeId, Connection connection, ServerContactPoint associatedSCP) throws JMSException { super(localNodeId); this.connection = connection; this.associatedSCP = associatedSCP; } @Override protected void onClosedOrBroken() { log.debug("Closing remote-initiated channel " + getChannelId()); super.onClosedOrBroken(); // on a clean shutdown, send "goodbye" message if (getState() == MessageChannelState.CLOSED) { sendShutdownMessageToRemoteRequestInbox(); } if (getShutdownSecurityToken() != null) { try { asyncSendShutdownMessageToB2CJmsQueue(); } catch (JMSException e) { log.debug("Error sending shutdown message for queue " + getOutgoingRequestQueueName(), e); } } else { log.warn("No shutdown security token set for remote-initiated connection"); } } }