2.4. Create a PullPoint Client
Overview
This section describes how to create a pull-point client of the notification broker. The pull-point client first creates a remote pull-point (which is used to accumulate messages), then subscribes the pull-point to a particular topic. Finally, the pull-point client retrieves the accumulated messages from the pull-point.
Sample PullPoint client code
Example 2.3, “PullPoint Client Code” shows the code for a sample pull-point client that subscribes to messages published on the
MyTopic
topic.
Example 2.3. PullPoint Client Code
// Java package org.jboss.fuse.example.wsn.pullpoint.client; import java.util.List; import java.util.Iterator; import javax.xml.bind.JAXBElement; import javax.xml.namespace.QName; import org.w3c.dom.Element; import org.apache.cxf.wsn.client.PullPoint; import org.apache.cxf.wsn.client.NotificationBroker; import org.apache.cxf.wsn.client.CreatePullPoint; import org.apache.cxf.wsn.client.Subscription; import org.oasis_open.docs.wsn.b_2.NotificationMessageHolderType; /** * */ public final class Client { private Client() { //not constructed } /** * @param args */ public static void main(String[] args) throws Exception { String wsnPort = "8182"; if (args.length > 0) { wsnPort = args[0]; } // Create a PullPoint CreatePullPoint createPullPoint = new CreatePullPoint("http://localhost:" + wsnPort + "/wsn/CreatePullPoint"); PullPoint pullPoint = createPullPoint.create(); // Create a PullPoint style subscription NotificationBroker notificationBroker = new NotificationBroker("http://localhost:" + wsnPort + "/wsn/NotificationBroker"); Subscription subscription = notificationBroker.subscribe(pullPoint, "MyTopic"); // Wait for some messages to accumulate in the pull point Thread.sleep(10000); // Now retrieve messages from the pull point List<NotificationMessageHolderType> messages = pullPoint.getMessages(10); if (!messages.isEmpty()) { Iterator<NotificationMessageHolderType> messageIterator = messages.iterator(); while (messageIterator.hasNext()) { NotificationMessageHolderType messageH = messageIterator.next(); Object o = messageH.getMessage().getAny(); System.out.println(messageH.getMessage().getAny()); if (o instanceof Element) { System.out.println(((Element)o).getTextContent()); } } } else { System.out.println("Warn: message list is empty!"); } subscription.unsubscribe(); pullPoint.destroy(); System.exit(0); } }
Steps to create a pullpoint client
Perform the following steps to create a PullPoint client:
- Use the
archetype:generate
goal to invoke theservicemix-cxf-code-first-osgi-bundle
archetype. Under thewsn
directory, invoke the Maven archetype as follows:mvn archetype:generate \ -DarchetypeGroupId=org.apache.servicemix.tooling \ -DarchetypeArtifactId=servicemix-cxf-code-first-osgi-bundle \ -DarchetypeVersion=2013.01.0.redhat-610379 \ -DgroupId=org.jboss.fuse.example \ -DartifactId=wsn-pullpoint \ -Dversion=1.0-SNAPSHOT \ -Dpackage=org.jboss.fuse.example.wsn.pullpoint
NoteThe backslash characters at the end of each line are effective as line-continuation characters on UNIX and LINUX platforms. If you are entering the command on a Windows platform, however, you must enter the entire command on a single line.You will be prompted to confirm the project settings, with a message similar to this one:Confirm properties configuration: groupId: org.jboss.fuse.example artifactId: wsn-pullpoint version: 1.0-SNAPSHOT package: org.jboss.fuse.example.wsn.pullpoint Y: :
Type Return to accept the settings and generate the project. When the command finishes, you should find a new Maven project in thewsn/wsn-pullpoint
directory. - Some of the generated project files are not needed for this tutorial. Under the
wsn/wsn-pullpoint
directory, delete the following files and directories:src/main/resources/META-INF/spring/beans.xml src/main/java/org/jboss/fuse/example/wsn/pullpoint/Person.java src/main/java/org/jboss/fuse/example/wsn/pullpoint/PersonImpl.java src/main/java/org/jboss/fuse/example/wsn/pullpoint/UnknownPersonFault.java src/main/java/org/jboss/fuse/example/wsn/pullpoint/types
- Edit the
pom.xml
file in thewsn-pullpoint
directory, and add the following dependency required for WS-Notification clients:<?xml version="1.0" encoding="UTF-8"?> <project ...> ... <dependencies> ... <!-- Needed for WS-Notification --> <dependency> <groupId>org.apache.cxf.services.wsn</groupId> <artifactId>cxf-services-wsn-api</artifactId> <version>2.7.0.redhat-610379</version> </dependency> </dependencies> ... </project>
- Edit the
Client.java
file in thewsn-pullpoint/src/main/java/org/jboss/fuse/example/wsn/pullpoint/client/
directory, remove the existing content, and replace it with the code from Example 2.3, “PullPoint Client Code”.
Test the PullPoint client
Test the PullPoint client as follows:
- If the JBoss A-MQ container is not already running (with the notification broker installed), start it up now:
./amq
- Run the publisher client at the command line. Open a new command prompt, and enter the following commands:
cd wsn/wsn-publisher mvn -Pclient
In the command window, you should see some output like the following:... INFO: Creating Service {http://cxf.apache.org/wsn/jaxws}NotificationBrokerService from WSDL: jar:file:/Users/fbolton/.m2/repository/org/apache/cxf/services/wsn/ cxf-services-wsn-api/2.6.0.redhat-60024/cxf-services-wsn-api-2.6.0.redhat-60024.jar !/org/apache/cxf/wsn/wsdl/wsn.wsdl
You now have approximately two minutes before the publisher client times out. - Run the PullPoint client at the command line. Open a new command prompt and enter the following commands:
cd wsn/wsn-pullpoint mvn -Pclient
After a ten second delay, you should see some output like the following:... INFO: Creating Service {http://cxf.apache.org/wsn/jaxws}PausableSubscriptionManagerService from WSDL: jar:file:/Users/fbolton/.m2/repository/org/apache/cxf/services/wsn/cxf-services-wsn-api/2.6.0.redhat-60024/cxf-services-wsn-api-2.6.0.redhat-60024.jar!/org/apache/cxf/wsn/wsdl/wsn.wsdl [ns8:foo: null] Hello World! [ns8:foo: null] Hello World! ...
- To inspect the state of the notification broker, you can connect to the JMX port of the ActiveMQ broker. Start up a JMX console by entering the following command at the command line:
jconsole
In the JConsole: New Connection dialog, select Remote Process and enter the following URL in the accompanying text field:service:jmx:rmi:///jndi/rmi://localhost:1099/karaf-root
In the Username and Password fields, enter one of the user credentials you created at the start of this tutorial. When you are connected to the JMX port, you can inspect the state of the broker by clicking on the MBeans tab and drilling down the object tree in the JConsole.