in modules/core/src/main/java/org/apache/sandesha2/util/TerminateManager.java [70:134]
public static void checkAndTerminate(ConfigurationContext configurationContext, StorageManager storageManager, RMSBean rmsBean)
throws SandeshaStorageException, AxisFault {
if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Enter: TerminateManager::checkAndTerminate " +rmsBean);
long lastOutMessage = rmsBean.getLastOutMessage ();
if (lastOutMessage > 0 && !rmsBean.isTerminateAdded()) {
boolean complete = AcknowledgementManager.verifySequenceCompletion(rmsBean.getClientCompletedMessages(), lastOutMessage);
//If this is RM 1.1 and RMAnonURI scenario, dont do the termination unless the response side createSequence has been
//received (RMDBean has been created) through polling, in this case termination will happen in the create sequence response processor.
String rmVersion = rmsBean.getRMVersion();
EndpointReference replyTo = rmsBean.getReplyToEndpointReference();
if (complete &&
Sandesha2Constants.SPEC_VERSIONS.v1_1.equals(rmVersion) && replyTo!=null && SandeshaUtil.isWSRMAnonymous(replyTo.getAddress())) {
RMDBean findBean = new RMDBean ();
findBean.setPollingMode(true);
findBean.setToEndpointReference(replyTo);
RMDBeanMgr rmdBeanMgr = storageManager.getRMDBeanMgr();
List<RMDBean> beans = rmdBeanMgr.find(findBean);
if(beans.isEmpty()) {
rmsBean.setTerminationPauserForCS(true);
storageManager.getRMSBeanMgr().update(rmsBean);
complete = false;
}
}
// If we are doing sync 2-way over WSRM 1.0 then we may need to keep sending messages,
// so check to see if all the senders have been removed
if (complete &&
Sandesha2Constants.SPEC_VERSIONS.v1_0.equals(rmVersion) && (replyTo==null || replyTo.hasAnonymousAddress())) {
SenderBean matcher = new SenderBean();
matcher.setMessageType(Sandesha2Constants.MessageTypes.APPLICATION);
matcher.setSequenceID(rmsBean.getSequenceID());
List<SenderBean> matches = storageManager.getSenderBeanMgr().find(matcher);
if(!matches.isEmpty()) complete = false;
}
if (complete) {
String referenceMsgKey = rmsBean.getReferenceMessageStoreKey();
if (referenceMsgKey==null) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.referenceMessageNotSetForSequence,rmsBean.getSequenceID());
throw new SandeshaException (message);
}
MessageContext referenceMessage = storageManager.retrieveMessageContext(referenceMsgKey, configurationContext);
if (referenceMessage==null) {
String message = SandeshaMessageHelper.getMessage(SandeshaMessageKeys.referencedMessageNotFound, rmsBean.getSequenceID());
throw new SandeshaException (message);
}
RMMsgContext referenceRMMsg = MsgInitializer.initializeMessage(referenceMessage);
addTerminateSequenceMessage(referenceRMMsg, rmsBean.getInternalSequenceID(), rmsBean.getSequenceID(), storageManager);
}
}
if(LoggingControl.isAnyTracingEnabled() && log.isDebugEnabled()) log.debug("Exit: TerminateManager::checkAndTerminate");
}