Updating the Service Consumer
The consumer side configuration includes setting up a CXF client to send a request to the provider, and setting up a CXF endpoint which will receive callback messages back from the provider. The client may be set up using Spring-based configuration. RequestCallbackFeature must be added to the client to work properly. The following is an example of Client Spring configuration:
CXF client configuration on consumer side
<jaxws:client id="library" serviceName="library:LibraryProvider"
endpointName="library:LibraryJmsPort"
address="jms:jndi:dynamicQueues/library.queue?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory&
;jndiConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61616"
serviceClass="org.talend.services.demos.library._1_0.Library">
<jaxws:features>
<bean class="org.talend.esb.mep.requestcallback.feature.RequestCallbackFeature"/>
</jaxws:features>
<jaxws:properties>
<entry key="org.talend.esb.mep.requestcallback.CallbackEndpoint">
<ref bean="custTestServiceConsumerEndpoint"/>
</entry>
</jaxws:properties>
</jaxws:client>
The setup of callback-receiving endpoint on the consumer side can be done via Spring configuration as well:
Callback-receiving endpoint Spring configuration
<jaxws:endpoint xmlns:library="http://services.talend.org/demos/Library/1.0"
id="LibraryConsumerJMS"
address="jms:jndi:dynamicQueues/libraryconsumer.queue?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory&jnd
iConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61616"
serviceName="library:LibraryConsumer" endpointName="library:LibraryConsumerPort"
implementor="org.talend.services.demos.client.LibraryConsumerImpl">
<jaxws:features>
<bean class="org.talend.esb.mep.requestcallback.feature.RequestCallbackFeature"/>
<bean class="org.apache.cxf.feature.LoggingFeature"/>
</jaxws:features>
<jaxws:properties>
<entry key="jaxws.provider.interpretNullAsOneway" value="true"/>
</jaxws:properties>
</jaxws:endpoint>
After both provider and consumer are set up, the request-callback message exchange can be done. The following is an example of sending a request:
Sending request from consumer to provider
public class LibraryTester {
...
/** The Library proxy will be injected either by spring or by a direct call to the setter */
Library library;
public void testRequestCallbackPositive() throws SeekBookError {
// Create new request object and fill it with
// some business data
SearchInBasementFor request = new SearchInBasementFor();
request.getAuthorLastName().add("Stripycat");
// Add correlation info map to the request context
Map<String, Object> rctx = ((BindingProvider) library).getRequestContext();
Map<String, Object> correlationInfo = new HashMap<String, Object>();
rctx.put(RequestCallbackFeature.CALL_INFO_PROPERTY_NAME, correlationInfo);
// Send request to the provider
library.seekBookInBasement(request);
...
}
CallContext object related to request-callback messages contains various information regarding a message. The following code snippet shows how to get the message information on the consumer side when callback message is received.
Receiving callback message
@WebServiceProvider
@Features(features = { "org.talend.esb.mep.requestcallback.feature.RequestCallbackFeature"})
public class LibraryConsumerImpl implements LibraryConsumer {
@Resource
private WebServiceContext wsContext;
public void seekBookInBasementResponse(ListOfBooks body) {
CallContext ctx = CallContext.getCallContext(wsContext.getMessageContext());
System.out.println("Info from CallContext:");
if (ctx == null) {
System.out.println("- no CallContext");
} else {
System.out.println("- Call ID is " + ctx.getCallId());
System.out.println("- Callback ID is " + ctx.getCallbackId());
}
}
...
}