use of nl.nn.adapterframework.core.SenderException in project iaf by ibissource.
the class MessageSendingPipe method doPipe.
public PipeRunResult doPipe(Object input, IPipeLineSession session) throws PipeRunException {
String originalMessage = input.toString();
String result = null;
String correlationID = session.getMessageId();
if (getInputWrapper() != null) {
log.debug(getLogPrefix(session) + "wrapping input");
PipeRunResult wrapResult = pipeProcessor.processPipe(getPipeLine(), inputWrapper, correlationID, input, session);
if (wrapResult != null && !wrapResult.getPipeForward().getName().equals(SUCCESS_FORWARD)) {
return wrapResult;
} else {
input = wrapResult.getResult();
}
log.debug(getLogPrefix(session) + "input after wrapping [" + input.toString() + "]");
}
if (getInputValidator() != null) {
log.debug(getLogPrefix(session) + "validating input");
PipeRunResult validationResult = pipeProcessor.processPipe(getPipeLine(), inputValidator, correlationID, input, session);
if (validationResult != null && !validationResult.getPipeForward().getName().equals(SUCCESS_FORWARD)) {
return validationResult;
}
}
if (StringUtils.isNotEmpty(getStubFileName())) {
ParameterList pl = getParameterList();
result = returnString;
if (pl != null) {
ParameterResolutionContext prc = new ParameterResolutionContext((String) input, session);
Map params;
try {
params = prc.getValueMap(pl);
} catch (ParameterException e1) {
throw new PipeRunException(this, getLogPrefix(session) + "got exception evaluating parameters", e1);
}
String sfn = null;
if (params != null && params.size() > 0) {
sfn = (String) params.get(STUBFILENAME);
}
if (sfn != null) {
try {
result = Misc.resourceToString(ClassUtils.getResourceURL(classLoader, sfn), SystemUtils.LINE_SEPARATOR);
log.info(getLogPrefix(session) + "returning result from dynamic stub [" + sfn + "]");
} catch (Throwable e) {
throw new PipeRunException(this, getLogPrefix(session) + "got exception loading result from stub [" + sfn + "]", e);
}
} else {
log.info(getLogPrefix(session) + "returning result from static stub [" + getStubFileName() + "]");
}
} else {
log.info(getLogPrefix(session) + "returning result from static stub [" + getStubFileName() + "]");
}
} else {
Map threadContext = new HashMap();
try {
String messageID = null;
// sendResult has a messageID for async senders, the result for sync senders
int retryInterval = getRetryMinInterval();
String sendResult = null;
boolean replyIsValid = false;
int retriesLeft = 0;
if (getMaxRetries() > 0) {
retriesLeft = getMaxRetries() + 1;
} else {
retriesLeft = 1;
}
while (retriesLeft-- >= 1 && !replyIsValid) {
try {
sendResult = sendMessage(input, session, correlationID, getSender(), threadContext);
if (retryTp != null) {
String retry = retryTp.transform(sendResult, null);
if (retry.equalsIgnoreCase("true")) {
if (retriesLeft >= 1) {
retryInterval = increaseRetryIntervalAndWait(session, retryInterval, "xpathRetry result [" + retry + "], retries left [" + retriesLeft + "]");
}
} else {
replyIsValid = true;
}
} else {
replyIsValid = true;
}
} catch (TimeOutException toe) {
if (retriesLeft >= 1) {
retryInterval = increaseRetryIntervalAndWait(session, retryInterval, "timeout occured, retries left [" + retriesLeft + "]");
} else {
throw toe;
}
} catch (SenderException se) {
if (retriesLeft >= 1) {
retryInterval = increaseRetryIntervalAndWait(session, retryInterval, "exception [" + (se != null ? se.getMessage() : "") + "] occured, retries left [" + retriesLeft + "]");
} else {
throw se;
}
}
}
if (!replyIsValid) {
throw new PipeRunException(this, getLogPrefix(session) + "invalid reply message is received");
}
if (getSender().isSynchronous()) {
if (log.isInfoEnabled()) {
log.info(getLogPrefix(session) + "sent message to [" + getSender().getName() + "] synchronously");
}
result = sendResult;
} else {
messageID = sendResult;
if (log.isInfoEnabled()) {
log.info(getLogPrefix(session) + "sent message to [" + getSender().getName() + "] messageID [" + messageID + "] correlationID [" + correlationID + "] linkMethod [" + getLinkMethod() + "]");
}
// as this will be used with the listener
if (getLinkMethod().equalsIgnoreCase("MESSAGEID")) {
correlationID = sendResult;
if (log.isDebugEnabled())
log.debug(getLogPrefix(session) + "setting correlationId to listen for to messageId [" + correlationID + "]");
}
}
ITransactionalStorage messageLog = getMessageLog();
if (messageLog != null) {
long messageLogStartTime = System.currentTimeMillis();
String messageTrail = "no audit trail";
if (auditTrailTp != null) {
if (isUseInputForExtract()) {
messageTrail = auditTrailTp.transform(originalMessage, null);
} else {
messageTrail = auditTrailTp.transform((String) input, null);
}
} else {
if (StringUtils.isNotEmpty(getAuditTrailSessionKey())) {
messageTrail = (String) (session.get(getAuditTrailSessionKey()));
}
}
String storedMessageID = messageID;
if (storedMessageID == null) {
storedMessageID = "-";
}
if (correlationIDTp != null) {
if (StringUtils.isNotEmpty(getCorrelationIDSessionKey())) {
String sourceString = (String) (session.get(getCorrelationIDSessionKey()));
correlationID = correlationIDTp.transform(sourceString, null);
} else {
if (isUseInputForExtract()) {
correlationID = correlationIDTp.transform(originalMessage, null);
} else {
correlationID = correlationIDTp.transform((String) input, null);
}
}
if (StringUtils.isEmpty(correlationID)) {
correlationID = "-";
}
}
String label = null;
if (labelTp != null) {
if (isUseInputForExtract()) {
label = labelTp.transform(originalMessage, null);
} else {
label = labelTp.transform((String) input, null);
}
}
if (sender instanceof MailSender) {
String messageInMailSafeForm = (String) session.get("messageInMailSafeForm");
if (hideRegex != null) {
if (getHideMethod().equalsIgnoreCase("FIRSTHALF")) {
messageInMailSafeForm = Misc.hideFirstHalf(messageInMailSafeForm, hideRegex);
} else {
messageInMailSafeForm = Misc.hideAll(messageInMailSafeForm, hideRegex);
}
}
messageLog.storeMessage(storedMessageID, correlationID, new Date(), messageTrail, label, messageInMailSafeForm);
} else {
String message = (String) input;
if (hideRegex != null) {
if (getHideMethod().equalsIgnoreCase("FIRSTHALF")) {
message = Misc.hideFirstHalf(message, hideRegex);
} else {
message = Misc.hideAll(message, hideRegex);
}
}
messageLog.storeMessage(storedMessageID, correlationID, new Date(), messageTrail, label, message);
}
long messageLogEndTime = System.currentTimeMillis();
long messageLogDuration = messageLogEndTime - messageLogStartTime;
StatisticsKeeper sk = getPipeLine().getPipeStatistics(messageLog);
sk.addValue(messageLogDuration);
}
if (sender instanceof MailSender) {
session.remove("messageInMailSafeForm");
}
if (getListener() != null) {
result = listenerProcessor.getMessage(getListener(), correlationID, session);
} else {
result = sendResult;
}
if (result == null) {
result = "";
}
if (timeoutPending) {
timeoutPending = false;
throwEvent(PIPE_CLEAR_TIMEOUT_MONITOR_EVENT);
}
} catch (TimeOutException toe) {
throwEvent(PIPE_TIMEOUT_MONITOR_EVENT);
if (!timeoutPending) {
timeoutPending = true;
}
PipeForward timeoutForward = findForward(TIMEOUT_FORWARD);
log.warn(getLogPrefix(session) + "timeout occured");
if (timeoutForward == null) {
if (StringUtils.isEmpty(getResultOnTimeOut())) {
timeoutForward = findForward(EXCEPTION_FORWARD);
} else {
timeoutForward = getForward();
}
}
if (timeoutForward != null) {
String resultmsg;
if (StringUtils.isNotEmpty(getResultOnTimeOut())) {
resultmsg = getResultOnTimeOut();
} else {
if (input instanceof String) {
resultmsg = new ErrorMessageFormatter().format(getLogPrefix(session), toe, this, (String) input, session.getMessageId(), 0);
} else {
if (input == null) {
input = "null";
}
resultmsg = new ErrorMessageFormatter().format(getLogPrefix(session), toe, this, input.toString(), session.getMessageId(), 0);
}
}
return new PipeRunResult(timeoutForward, resultmsg);
}
throw new PipeRunException(this, getLogPrefix(session) + "caught timeout-exception", toe);
} catch (Throwable t) {
throwEvent(PIPE_EXCEPTION_MONITOR_EVENT);
PipeForward exceptionForward = findForward(EXCEPTION_FORWARD);
if (exceptionForward != null) {
log.warn(getLogPrefix(session) + "exception occured, forwarding to exception-forward [" + exceptionForward.getPath() + "], exception:\n", t);
String resultmsg;
if (input instanceof String) {
resultmsg = new ErrorMessageFormatter().format(getLogPrefix(session), t, this, (String) input, session.getMessageId(), 0);
} else {
if (input == null) {
input = "null";
}
resultmsg = new ErrorMessageFormatter().format(getLogPrefix(session), t, this, input.toString(), session.getMessageId(), 0);
}
return new PipeRunResult(exceptionForward, resultmsg);
}
throw new PipeRunException(this, getLogPrefix(session) + "caught exception", t);
}
}
if (!validResult(result)) {
PipeForward illegalResultForward = findForward(ILLEGAL_RESULT_FORWARD);
return new PipeRunResult(illegalResultForward, result);
}
IPipe outputValidator = getOutputValidator();
if (outputValidator != null) {
log.debug(getLogPrefix(session) + "validating response");
PipeRunResult validationResult;
validationResult = pipeProcessor.processPipe(getPipeLine(), outputValidator, correlationID, result, session);
if (validationResult != null && !validationResult.getPipeForward().getName().equals(SUCCESS_FORWARD)) {
return validationResult;
}
}
if (getOutputWrapper() != null) {
log.debug(getLogPrefix(session) + "wrapping response");
PipeRunResult wrapResult = pipeProcessor.processPipe(getPipeLine(), outputWrapper, correlationID, result, session);
if (wrapResult != null && !wrapResult.getPipeForward().getName().equals(SUCCESS_FORWARD)) {
return wrapResult;
}
result = wrapResult.getResult().toString();
log.debug(getLogPrefix(session) + "response after wrapping [" + result + "]");
}
if (isStreamResultToServlet()) {
byte[] bytes = Base64.decodeBase64(new String(result));
try {
String contentType = (String) session.get("contentType");
if (StringUtils.isNotEmpty(contentType)) {
RestListenerUtils.setResponseContentType(session, contentType);
}
RestListenerUtils.writeToResponseOutputStream(session, bytes);
} catch (IOException e) {
throw new PipeRunException(this, getLogPrefix(session) + "caught exception", e);
}
return new PipeRunResult(getForward(), "");
} else {
return new PipeRunResult(getForward(), result);
}
}
use of nl.nn.adapterframework.core.SenderException in project iaf by ibissource.
the class ForEachChildElementPipe method iterateInput.
protected void iterateInput(Object input, IPipeLineSession session, String correlationID, Map threadContext, ItemCallback callback) throws SenderException, TimeOutException {
Reader reader = null;
try {
if (input instanceof Reader) {
reader = (Reader) input;
} else if (input instanceof InputStream) {
reader = new InputStreamReader((InputStream) input, getCharset());
} else if (isProcessFile()) {
// TODO: arrange for non-namespace aware processing of files
reader = new InputStreamReader(new FileInputStream((String) input), getCharset());
}
} catch (FileNotFoundException e) {
throw new SenderException("could not find file [" + input + "]", e);
} catch (UnsupportedEncodingException e) {
throw new SenderException("could not use charset [" + getCharset() + "]", e);
}
ItemCallbackCallingHandler handler = new ItemCallbackCallingHandler(callback);
if (getExtractElementsTp() != null) {
log.debug("transforming input to obtain list of elements using xpath [" + getElementXPathExpression() + "]");
try {
SAXResult transformedStream = new SAXResult();
Source src;
if (reader != null) {
src = new StreamSource(reader);
} else {
src = XmlUtils.stringToSourceForSingleUse((String) input, isNamespaceAware());
}
transformedStream.setHandler(handler);
getExtractElementsTp().transform(src, transformedStream, null);
} catch (Exception e) {
if (handler.getTimeOutException() != null) {
throw handler.getTimeOutException();
}
if (!handler.isStopRequested()) {
throw new SenderException("Could not extract list of elements using xpath [" + getElementXPathExpression() + "]", e);
}
}
} else {
try {
if (reader != null) {
XmlUtils.parseXml(handler, new InputSource(reader));
} else {
XmlUtils.parseXml(handler, (String) input);
}
} catch (Exception e) {
if (handler.getTimeOutException() != null) {
throw handler.getTimeOutException();
}
if (!handler.isStopRequested()) {
throw new SenderException("Could not parse input", e);
}
}
}
}
use of nl.nn.adapterframework.core.SenderException in project iaf by ibissource.
the class IfsaRequesterSender method sendMessage.
public String sendMessage(String dummyCorrelationId, String message, ParameterResolutionContext prc) throws SenderException, TimeOutException {
try {
if (isSynchronous()) {
if (JtaUtil.inTransaction()) {
throw new SenderException("cannot send RR message from within a transaction");
}
} else {
if (!JtaUtil.inTransaction()) {
log.warn("FF messages should be sent from within a transaction");
}
}
} catch (Exception e) {
// N.B. do not move this catch clause down; this will catch TimeOutExceptions unwantedly
throw new SenderException(e);
}
ParameterValueList paramValueList;
try {
paramValueList = prc.getValues(paramList);
} catch (ParameterException e) {
throw new SenderException(getLogPrefix() + "caught ParameterException in sendMessage() determining serviceId", e);
}
Map params = new HashMap();
if (paramValueList != null && paramList != null) {
for (int i = 0; i < paramList.size(); i++) {
String key = paramList.getParameter(i).getName();
String value = paramValueList.getParameterValue(i).asStringValue(null);
params.put(key, value);
}
}
// IFSAMessage originatingMessage = (IFSAMessage)prc.getSession().get(PushingIfsaProviderListener.THREAD_CONTEXT_ORIGINAL_RAW_MESSAGE_KEY);
String BIF = (String) prc.getSession().get(getBifNameSessionKey());
if (StringUtils.isEmpty(BIF)) {
BIF = (String) prc.getSession().get(PushingIfsaProviderListener.THREAD_CONTEXT_BIFNAME_KEY);
}
return sendMessage(dummyCorrelationId, message, params, BIF, null);
}
use of nl.nn.adapterframework.core.SenderException in project iaf by ibissource.
the class IfsaRequesterSender method getRawReplyMessage.
/**
* Retrieves a message with the specified correlationId from queue or other channel, but does no processing on it.
*/
private Message getRawReplyMessage(QueueSession session, IFSAQueue queue, TextMessage sentMessage) throws SenderException, TimeOutException {
String selector = null;
Message msg = null;
QueueReceiver replyReceiver = null;
try {
replyReceiver = getReplyReceiver(session, sentMessage);
selector = replyReceiver.getMessageSelector();
long timeout = getExpiry(queue);
log.debug(getLogPrefix() + "start waiting at most [" + timeout + "] ms for reply on message using selector [" + selector + "]");
msg = replyReceiver.receive(timeout);
if (msg == null) {
log.info(getLogPrefix() + "received null reply");
} else {
log.info(getLogPrefix() + "received reply");
}
} catch (Exception e) {
throw new SenderException(getLogPrefix() + "got exception retrieving reply", e);
} finally {
try {
closeReplyReceiver(replyReceiver);
} catch (IfsaException e) {
log.error(getLogPrefix() + "error closing replyreceiver", e);
}
}
if (msg == null) {
throw new TimeOutException(getLogPrefix() + " timed out waiting for reply using selector [" + selector + "]");
}
if (msg instanceof IFSATimeOutMessage) {
throw new TimeOutException(getLogPrefix() + "received IFSATimeOutMessage waiting for reply using selector [" + selector + "]");
}
return msg;
// try {
// TextMessage result = (TextMessage)msg;
// return result;
// } catch (Exception e) {
// throw new SenderException(getLogPrefix()+"reply received for message using selector ["+selector+"] cannot be cast to TextMessage ["+msg.getClass().getName()+"]",e);
// }
}
use of nl.nn.adapterframework.core.SenderException in project iaf by ibissource.
the class IfsaRequesterSender method sendMessage.
/**
* Execute a request to the IFSA service.
* @return in Request/Reply, the retrieved message or TIMEOUT, otherwise null
*/
public String sendMessage(String dummyCorrelationId, String message, Map params) throws SenderException, TimeOutException {
Connection conn = null;
Map udzMap = null;
try {
String realServiceId;
// Extract parameters
if (params != null && params.size() > 0) {
// Use first param as serviceId
realServiceId = (String) params.get("serviceId");
if (realServiceId == null) {
realServiceId = getServiceId();
}
String occurrence = (String) params.get("occurrence");
if (occurrence != null) {
int i = realServiceId.indexOf('/', realServiceId.indexOf('/', realServiceId.indexOf('/', realServiceId.indexOf('/') + 1) + 1) + 1);
int j = realServiceId.indexOf('/', i + 1);
realServiceId = realServiceId.substring(0, i + 1) + occurrence + realServiceId.substring(j);
}
// Use remaining params as outgoing UDZs
udzMap = new HashMap(params);
udzMap.remove("serviceId");
udzMap.remove("occurrence");
} else {
realServiceId = getServiceId();
}
// Open connection to the Application ID
conn = ConnectionManager.getConnection(getApplicationId());
// Create the request, and set the Service URI to the Service ID
ServiceRequest request = new ServiceRequest(new BusinessMessage(message));
request.setServiceURI(new ServiceURI(realServiceId));
addUdzMapToRequest(udzMap, request);
if (isSynchronous()) {
// RR handling
if (timeOut > 0) {
request.setTimeout(timeOut);
}
RequestReplyAccessBean rrBean = RequestReplyAccessBean.getInstance();
ServiceReply reply = rrBean.sendReceive(conn, request);
return reply.getBusinessMessage().getText();
} else {
// FF handling
FireForgetAccessBean ffBean = FireForgetAccessBean.getInstance();
ffBean.send(conn, request);
return null;
}
} catch (com.ing.ifsa.exceptions.TimeoutException toe) {
throw new TimeOutException(toe);
} catch (IFSAException e) {
throw new SenderException(e);
} finally {
if (conn != null) {
conn.close();
}
}
}
Aggregations