Hi Justin Bertram,
I have create client to send messages to Queue "ReceptionQueue", and configuration subsystem added into standalone-full.xml.
Please let me know do I have to add any other configuration?
I see below exception:
Caught: javax.jms.JMSException: Failed to create session factory
javax.jms.JMSException: Failed to create session factory
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:727)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:233)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:229)
at com.slb.swi.dct.utilities.MQTest.main(MQTest.java:27)
Caused by: ActiveMQNotConnectedException[errorType=NOT_CONNECTED message=AMQ119007: Cannot connect to server(s). Tried with all available servers.]
at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:777)
at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:724)
... 3 more
Below is code and xml configuration.
Java client:
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.api.jms.JMSFactoryType;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;
public class MQTest {
public static void main(String[] args) {
try {
TransportConfiguration transportConfiguration = new TransportConfiguration(
NettyConnectorFactory.class.getName());
ConnectionFactory cf = ActiveMQJMSClient
.createConnectionFactoryWithoutHA(JMSFactoryType.CF,
transportConfiguration);
Queue orderQueue = ActiveMQJMSClient
.createQueue("jms/queue/ReceptionQueue");
Connection connection = cf.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(orderQueue);
connection.start();
TextMessage message = session.createTextMessage("Sending Test Message");
producer.send(message);
session.close();
connection.close();
} catch (Exception e) {
System.out.println("Caught: " + e);
e.printStackTrace();
}
}
}
Standalone-full.xml:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0">
<server name="default">
<security-setting name="#">
<role name="guest" delete-non-durable-queue="true" create-non-durable-queue="true" consume="true" send="true"/>
</security-setting>
<address-setting name="#" message-counter-history-day-limit="10" page-size-bytes="2097152" max-size-bytes="10485760" expiry-address="jms.queue.ExpiryQueue" dead-letter-address="jms.queue.DLQ"/>
<http-connector name="http-connector" endpoint="http-acceptor" socket-binding="http"/>
<http-connector name="http-connector-throughput" endpoint="http-acceptor-throughput" socket-binding="http">
<param name="batch-delay" value="50"/>
</http-connector>
<remote-connector name="netty" socket-binding="messaging"/>
<in-vm-connector name="in-vm" server-id="0"/>
<http-acceptor name="http-acceptor" http-listener="default"/>
<http-acceptor name="http-acceptor-throughput" http-listener="default">
<param name="batch-delay" value="50"/>
<param name="direct-deliver" value="false"/>
</http-acceptor>
<remote-acceptor name="netty" socket-binding="messaging"/>
<in-vm-acceptor name="in-vm" server-id="0"/>
<jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
<jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
<jms-queue name="TestSwiQ" entries="java:/jboss/exported/jms/queue/TestSwiQ"/>
<jms-queue name="ReceptionQueue" entries="java:/jboss/exported/jms/queue/ReceptionQueue"/>
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="netty"/>
<pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/>
</server>
</subsystem>
With the same configuration could able to post messages to queue with below java client program, but not able to connect with netty configuration.
import java.io.IOException;
import java.util.Properties;
//jms stuff
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class WildFlyJmsQueueSender {
public final static String JMS_CONNECTION_FACTORY_JNDI="jms/RemoteConnectionFactory";
public final static String JMS_QUEUE_JNDI="jms/queue/ReceptionQueue";
public static String JMS_USERNAME="swiuser"; // The role for this user is "guest" in ApplicationRealm
public static String JMS_PASSWORD="swiuser123";
public final static String WILDFLY_REMOTING_URL="http-remoting://localhost:8080";
private QueueConnectionFactory qconFactory;
private QueueConnection qcon;
private QueueSession qsession;
private QueueSender qsender;
private Queue queue;
private TextMessage msg;
public static void main(String[] args) throws Exception {
InitialContext ic = getInitialContext();
WildFlyJmsQueueSender queueSender = new WildFlyJmsQueueSender();
queueSender.init(ic, JMS_QUEUE_JNDI);
readAndSend(queueSender);
queueSender.close();
}
public void init(Context ctx, String queueName) throws NamingException, JMSException {
qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_CONNECTION_FACTORY_JNDI);
// If you won't pass jms credential here then you will get
// [javax.jms.JMSSecurityException: HQ119031: Unable to validate user: null]
qcon = qconFactory.createQueueConnection(this.JMS_USERNAME, this.JMS_PASSWORD);
qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(queueName);
qsender = qsession.createSender(queue);
msg = qsession.createTextMessage();
qcon.start();
}
public void send(String message,int counter) throws JMSException {
msg.setText(message);
msg.setIntProperty("counter", counter);
qsender.send(msg);
}
public void close() throws JMSException {
qsender.close();
qsession.close();
qcon.close();
}
private static void readAndSend(WildFlyJmsQueueSender wildFlyJmsQueueSender) throws IOException, JMSException {
String line="Test Message Body with counter = ";
for(int i=0;i<10;i++) {
wildFlyJmsQueueSender.send(line+i,i);
System.out.println("JMS Message Sent: "+line+i+"\n");
}
}
private static InitialContext getInitialContext() throws NamingException {
InitialContext context=null;
try {
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
props.put(Context.PROVIDER_URL, WILDFLY_REMOTING_URL); // NOTICE: "http-remoting" and port "8080"
props.put(Context.SECURITY_PRINCIPAL, JMS_USERNAME);
props.put(Context.SECURITY_CREDENTIALS, JMS_PASSWORD);
//props.put("jboss.naming.client.ejb.context", true);
context = new InitialContext(props);
System.out.println("\n\tGot initial Context: "+context);
} catch (Exception e) {
e.printStackTrace();
}
return context;
}
}
Regards,
Rama.