Using the Consumer instance inserted by the service engine, you can declare a field of the Consumer type (org.glassfish.openesb.pojose.api.Consumer) and annotate it with ConsumerEndpoint (org.glassfish.openesb.pojose.api.annotation.ConsumerEndpoint). The POJO SE uses the endpoint name and service QName specified on the ConsumerEndpoint annotation to find the ServiceEndpoint instance and insert it into the POJO instance before the operation method is called. You can optionally specify inMessageTypeQN and operationQN if required by the component being called.
First declare the Consumer field as shown below.
@ConsumerEndpoint(name="asiaBPELProcess", serviceQN="AsiaSvc", interfaceQN="{wwOrderProcessNS}wwOrderProcessPortType", operationQN="{wwOrderProcessNS}wwOrderProcessOperation", inMessageTypeQN="{wwOrderProcessNS}wwOrderProcessOperationRequest") private Consumer asiaEp; |
Use the Consumer instance inserted by the POJO SE, as shown below.
outputMsg = (Node) cons.sendSynchInOut(input, MessageObjectType.Node); |
Below is a complete example.
package org.glassfish.openesb.pojo.cbr; import org.glassfish.openesb.pojose.api.annotation.Provider; import org.glassfish.openesb.pojose.api.annotation.Operation; import org.glassfish.openesb.pojose.api.annotation.ConsumerEndpoint; import org.glassfish.openesb.pojose.api.Consumer; import org.glassfish.openesb.pojose.api.Consumer.MessageObjectType; import org.w3c.dom.Node; import java.util.logging.Level; import java.util.logging.Logger; @Provider public class WWOrderRouter { @ConsumerEndpoint(name="asiaBPELProcess", serviceQN="AsiaSvc", interfaceQN="{wwOrderProcessNS}wwOrderProcessPortType", operationQN="{wwOrderProcessNS}wwOrderProcessOperation", inMessageTypeQN="{wwOrderProcessNS}wwOrderProcessOperationRequest") private Consumer asiaEp; @ConsumerEndpoint(name="europeBPELProcess", serviceQN="EuropeSvc", interfaceQN="{wwOrderProcessNS}wwOrderProcessPortType" operationQN="{wwOrderProcessNS}wwOrderProcessOperation", inMessageTypeQN="{wwOrderProcessNS}wwOrderProcessOperationRequest") @Resource private Context ctx; public WWOrderRouter() { } @Operation(outMessageTypeQN="{http://cbr.pojo.openesb.glassfish.org/WWOrderRouter/} WWOrderRouterOperationResponse") public Node receive(Node input) { try { Node outputMsg = input; location = ... Consumer cons = null; if ("Asia".equals(location)) { svc2use = this.asiaSvcName; cons = asiaEp; } else { svc2use = this.europeSvcName; cons = europeEp; } outputMsg = (Node) cons.sendSynchInOut(input, MessageObjectType.Node); return outputMsg; } catch (Exception ex) { Logger.getLogger(WWOrderRouter.class.getName()).log(Level.SEVERE, null, ex); } return input; } } |
Use a Context method to retrieve the instance of ServiceEndpoint, and use it again to retrieve the instance of Consumer from the Context instance.
QName svc2use = ....; String endpointName = ....; ServiceEndpoint se = this.ctx.getEndpoint(svc2use, endpointName); Consumer cons = this.ctx.getConsumer(se, this.consOpName, this.consInMsgType); outputMsg = (Node) cons.sendSynchInOut(input, MessageObjectType.Node); |