use of org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext in project petals-se-flowable by petalslink.
the class NormalizedMessageOutputStream method close.
@Override
public void close() throws IOException {
super.close();
// needed so that logs are put in the right flow instance folder
PetalsExecutionContext.putFlowAttributes(this.flowAttributes);
final Exchange cxfExchange = this.cxfMessage.getExchange();
final EndpointInfo endpointInfo = cxfExchange.getEndpoint().getEndpointInfo();
final QName interfaceName = endpointInfo.getInterface().getName();
final QName serviceName = endpointInfo.getService().getName();
final OperationInfo operationInfo = cxfExchange.getBindingOperationInfo().getOperationInfo();
final QName operationName = operationInfo.getName();
try {
Consumes consume = this.sender.getComponent().getServiceUnitManager().getConsumesFromDestination(null, serviceName, interfaceName, operationName);
final MEPPatternConstants mep = getMEP(operationInfo, consume);
if (consume == null) {
this.sender.getLogger().log(Level.WARNING, String.format("No Consumes declared in the JBI descriptor for the request to send, using informations from the process and default timeout: interface=%s, serviceName=%s, operation=%s, mep=%s", interfaceName, serviceName, operationName, mep));
consume = new Consumes();
// TODO: Create a unit test where the interface name is missing
consume.setInterfaceName(interfaceName);
// TODO: Create a unit test where the service name is missing
consume.setServiceName(serviceName);
} else {
if (interfaceName != null && !consume.getInterfaceName().equals(interfaceName)) {
this.sender.getLogger().log(Level.WARNING, "Mismatch between JBI Consumes interface name and process information (" + consume.getInterfaceName() + " vs " + interfaceName + "), using Consumes information.");
}
if (serviceName != null && !serviceName.equals(consume.getServiceName())) {
this.sender.getLogger().log(Level.WARNING, "Mismatch between JBI Consumes service name and process information (" + consume.getServiceName() + " vs " + serviceName + "), using Consumes information.");
}
}
// TODO: Find a way to define the endpoint name to use: maybe the address could contain it in endpointInfo?
// TODO: Create a unit test where the endpoint name is missing
// TODO: Create a unit test where the operation name is missing
final org.ow2.petals.component.framework.api.message.Exchange jbiExchange = this.sender.createExchange(consume, mep, this.extFlowTracingActivated);
// We always use the operation from the process (the JBI Consumes defines the service used, not the
// operation)
jbiExchange.setOperation(operationName);
// Set timeout at CXF level. It must be upper than the timeout defined into SU JBI descriptor level)
final long timeout = this.sender.getTimeout(consume);
if (timeout > 0) {
cxfExchange.getOutMessage().put(ClientImpl.SYNC_TIMEOUT, timeout + CXF_SYNC_TIMEOUT_INTERNAL_PART);
}
// TODO: Add support for attachments
// TODO: MUST be optimized generating directly an XML message by CXF or Flowable
// The buffer contains a SOAP message, we just remove the SOAP envelope
final DocumentBuilder docBuilder = DocumentBuilders.takeDocumentBuilder();
try {
if (this.sender.getLogger().isLoggable(Level.FINE)) {
this.sender.getLogger().fine("Request to send: " + new String(buf));
}
final Document doc = docBuilder.parse(new ByteArrayInputStream(buf));
final NodeList soapBodies = doc.getElementsByTagNameNS("http://schemas.xmlsoap.org/soap/envelope/", "Body");
if (soapBodies.item(0).hasChildNodes()) {
final Node xmlPayload = soapBodies.item(0).getFirstChild();
jbiExchange.setInMessageContent(new DOMSource(xmlPayload));
} else {
throw new IOException("Empty service task request");
}
} catch (final SAXException e) {
throw new IOException(e);
} finally {
DocumentBuilders.releaseDocumentBuilder(docBuilder);
}
// TODO: Try to find a way to send exchange asynchronously
if (cxfExchange.isOneWay()) {
if (this.sender.sendSync(jbiExchange)) {
if (jbiExchange.isErrorStatus()) {
// An error was returned
throw jbiExchange.getError();
} else if (jbiExchange.isDoneStatus()) {
// Status DONE returned
} else {
// A fault was returned
final Message cxfInMessage = new MessageImpl();
cxfInMessage.setExchange(cxfExchange);
final Document faultReceived = PetalsConduit.wrapAsSoapFault(jbiExchange.getFault());
final EasyByteArrayOutputStream ebaos = new EasyByteArrayOutputStream();
DOMHelper.prettyPrint(faultReceived, ebaos);
if (LOG.isLoggable(Level.FINE)) {
LOG.fine("Fault XML payload received: " + ebaos.toString());
}
cxfInMessage.setContent(InputStream.class, ebaos.toByteArrayInputStream());
this.conduit.getMessageObserver().onMessage(cxfInMessage);
jbiExchange.setDoneStatus();
this.sender.send(jbiExchange);
}
} else {
// A timeout occurs
throw new MessagingException("A timeout occurs invoking service.");
}
} else {
this.sender.sendAsync(jbiExchange, new PetalsFlowableAsyncContext(cxfExchange, this.asyncCallback));
}
} catch (final IOException e) {
throw e;
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
use of org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext in project petals-se-flowable by petalslink.
the class FlowableJBIListener method onExpiredAsyncJBIMessage.
@Override
public void onExpiredAsyncJBIMessage(final Exchange asyncExchange, final AsyncContext asyncContext) {
// TODO: Add MONIT trace
if (asyncContext instanceof PetalsFlowableAsyncContext) {
final PetalsFlowableAsyncContext petalsFlowableAsyncContext = (PetalsFlowableAsyncContext) asyncContext;
petalsFlowableAsyncContext.getAsyncCallback().onExpiredMessage(asyncExchange, petalsFlowableAsyncContext.getCxfExchange());
} else {
this.getLogger().warning("Unexpected expired asynchronous context received: " + asyncContext.getClass().getName());
}
}
use of org.ow2.petals.flowable.outgoing.PetalsFlowableAsyncContext in project petals-se-flowable by petalslink.
the class FlowableJBIListener method onAsyncJBIMessage.
@Override
public boolean onAsyncJBIMessage(final Exchange asyncExchange, final AsyncContext asyncContext) {
// TODO: Add MONIT trace
if (asyncContext instanceof PetalsFlowableAsyncContext) {
final PetalsFlowableAsyncContext petalsFlowableAsyncContext = (PetalsFlowableAsyncContext) asyncContext;
petalsFlowableAsyncContext.getAsyncCallback().onMessage(asyncExchange, petalsFlowableAsyncContext.getCxfExchange());
} else {
this.getLogger().warning("Unexpected asynchronous context received: " + asyncContext.getClass().getName());
}
return true;
}
Aggregations