The following article shows how to create a simple JMS Topic using WildFly and older versions of JBoss application server.
Creating a JMS Topic with WildFly
If you want to create a new Topic, the command to be executed from the CLI is the following one:
[standalone@localhost:9990 /] jms-topic add --topic-address=jms.topic.DemoTopic --entries=java:/jms/topic/demoTopic
The following topic will be added in your XML configuration:
<jms-topic name="jms.topic.DemoTopic" entries="java:/jms/topic/demoTopic"/>
On the other hand, if you are using Domain mode, you should specify the profile as argument:
[domain@localhost:9990 /] jms-topic add --profile=full-ha --topic-address=jms.topic.DemoTopic --entries=java:/jms/topic/demoTopic
To see an example application which uses JMS to send messages, check this tutorial: JBoss JMS configuration
Creating a Deployable Topic
JMS destinations can be also be created on the fly by dropping a *-jms.xml file in the deployments folder of your standalone server or packaging it along with your application. Here’s an example of a JMS Queue and a JMS Topic:
<messaging-deployment xmlns="urn:jboss:messaging-activemq-deployment:1.0">
<server>
<jms-destinations>
<jms-queue name="ExampleQueue">
<entry name="java:/jms/queue/ExampleQueue"/>
<durable>true</durable>
</jms-queue>
<jms-topic name="ExampleTopic">
<entry name="java:/jms/topic/ExampleTopic"/>
</jms-topic>
</jms-destinations>
</server>
</messaging-deployment>
Creating a JMS Topic with JBoss 5
At first you need to deploy a JMS Topic to JBoss. Create a file ending with -service.xml in the deploy folder of JBoss.
Case 1: JBoss Messaging
If you are running JBoss 5, which ships with JBoss messaging you can use the following descriptor:
<mbean code="org.jboss.jms.server.destination.TopicService" name="jboss.messaging.destination:service=Topic,name=topicA" xmbean-dd="xmdesc/Topic-xmbean.xml"> <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> <depends>jboss.messaging:service=PostOffice</depends> </mbean>
Case 2: JBoss MQ
If you using JBoss older JMS provider, the configuration file is the following:
<mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Queue,name=topicA"> <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends> </mbean>
Example Code:
package com.sample;
import java.util.Properties;
import java.util.Scanner;
import javax.jms.*;
import javax.naming.Context;
public class TopicExample implements MessageListener
{
public void example() throws Exception
{
String destinationName = "topic/topicA";
Context ic = null;
ConnectionFactory cf = null;
Connection connection = null;
try
{
ic = getInitialContext();
cf = (ConnectionFactory)ic.lookup("/ConnectionFactory");
Topic topic = (Topic)ic.lookup(destinationName);
connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer publisher = session.createProducer(topic);
MessageConsumer subscriber = session.createConsumer(topic);
subscriber.setMessageListener(this);
connection.start();
TextMessage message = session.createTextMessage("Hello!");
publisher.send(message);
Scanner keyIn = new Scanner(System.in);
System.out.print("JMS Server listening. Type a Key + CR to exit\n");
keyIn.next();
}
finally
{
if(ic != null)
{
try
{
ic.close();
}
catch(Exception e)
{
throw e;
}
}
// ALWAYS close your connection in a finally block to avoid leaks.
// Closing connection also takes care of closing its related objects e.g. sessions.
closeConnection(connection);
}
}
public synchronized void onMessage(Message message)
{
TextMessage text = (TextMessage)message;
String strMessage = null;
try {
strMessage = text.getText();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Message received: "+strMessage);
}
private void closeConnection(Connection con)
{
try
{
if (con != null)
{
con.close();
}
}
catch(JMSException jmse)
{
System.out.println("Could not close connection " + con +" exception was " + jmse);
}
}
protected boolean isQueueExample()
{
return true;
}
public static void main(String[] args) throws Exception
{
new TopicExample().example();
}
public static Context getInitialContext( )
throws javax.naming.NamingException {
Properties p = new Properties( );
p.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES,
" org.jboss.naming:org.jnp.interfaces");
p.put(Context.PROVIDER_URL, "jnp://localhost:1099");
return new javax.naming.InitialContext(p);
}
}