JMS problem on JBoss 7.0.1 Final with JNDI context
haukegulich Sep 16, 2011 4:26 AMHi,
I got this error:
{color:#f00}javax.naming.NamingException: Failed instantiate InitialContextFactory org.jnp.interfaces.NamingContextFactory from classloader ModuleClassLoader for Module "deployment.ear-1.0.0.ear.client-1.0.0.war:main" from Service Module Loader{color}
and after changing
{code}Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
props.setProperty("java.naming.provider.url", ipaddress);
Context context = new InitialContext(props);{code}
to
{code}
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jboss.as.naming.InitialContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
props.setProperty("java.naming.provider.url", ipaddress);
Context context = new InitialContext(props);
{code}
this error is gone.
Now I get this error
{color:#f00}javax.naming.NameNotFoundException: Name 'ConnectionFactory' not found in context ''{color}
so I looked at the jmx console
So I changed the lookup to
{code}
QueueConnectionFactory tcf = (QueueConnectionFactory) context.lookup("java:jboss/UserTransaction");
{code}
And then I get this message:
{color:#f00}java.lang.ClassCastException: com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple cannot be cast to javax.jms.QueueConnectionFactory{color}
Here is my whole class. Its a singleton pattern on client side (sorry for german comments inside the program)
{code}
package de.hauke.client.jms;
import java.util.Properties;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.apache.log4j.Logger;
import de.hauke.client.helper.InterfaceHelper;
import de.hauke.server.configuration.ConfigurationHelper;
public class JMSSender {
private static final Logger logger = Logger.getLogger(JMSSender.class);
private static String ipaddress = null;
private static String queueName = null;
private static QueueConnection conn = null;
private static QueueSession session = null;
private static Queue queue = null;
private static JMSSender instance = null;
private JMSSender(){
}
/**
* Dieses Objekt soll nur ueber ein Singleton Pattern geladen werden.
*
* @return
*/
public static JMSSender getInstance() {
System.out.println("getting jmssender");
if(instance == null) {
// Wenn das Objekt noch nicht geladen wurde, muessen Einstellungen
// aus der Datenbank geladen werden.
queueName = InterfaceHelper.getConfigurationHelper().getValue(ConfigurationHelper.CONFIGKEY_JMS_QUEUE_TOSERVER);
ipaddress = InterfaceHelper.getConfigurationHelper().getValue(ConfigurationHelper.CONFIGKEY_IPADDRESS_JBOSS);
System.out.println("Queuename : " + queueName);
System.out.println("IPAddress : " + ipaddress);
instance = new JMSSender();
instance.init();
}
return instance;
}
public static void reset() {
instance = null;
}
private void init() {
System.out.println("init jms sender");
try {
Properties props = new Properties();
// java.naming.factory.initial=org.jboss.as.naming.InitialContextFactory
// props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.factory.initial", "org.jboss.as.naming.InitialContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
props.setProperty("java.naming.provider.url", ipaddress);
Context context = new InitialContext(props);
QueueConnectionFactory tcf = (QueueConnectionFactory) context.lookup("java:jboss/UserTransaction");
conn = tcf.createQueueConnection();
queue = (Queue) context.lookup(queueName);
System.out.println("conn ist " + conn != null ? " nicht null " : "null");
System.out.println("queue ist " + queue != null ? " nicht null " : "null");
session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
conn.start();
System.out.println("session ist " + session != null ? " nicht null " : "null");
instance = new JMSSender();
} catch (Exception ex) {
System.out.println("Fehler beim erzeugen des JMS Sender : " + ex);
}
}
public void send(String text) {
try {
QueueSender send = session.createSender(queue);
TextMessage tm = session.createTextMessage(text);
send.send(tm);
send.close();
logger.info("Diese Nachricht wird an die JMS Queue geschickt : " + text);
} catch (Exception ex) {
System.out.println("Fehler beim verschicken einer Nachricht : [" + text + "]" + ex);
}
}
}
{code}
Here is the JMS part of the standalone-xts.xml
I added the queue queue/toServer
I also tried as context lookup value java:/JmsXA and java:/ConnectionFactory without luck
{code:xml}
<!--JMS Stuff-->
<jms-connection-factories>
<connection-factory name="InVmConnectionFactory">
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<entry name="java:/ConnectionFactory"/>
</entries>
</connection-factory>
<connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="RemoteConnectionFactory"/>
</entries>
</connection-factory>
<pooled-connection-factory name="hornetq-ra">
<transaction mode="xa"/>
<connectors>
<connector-ref connector-name="in-vm"/>
</connectors>
<entries>
<entry name="java:/JmsXA"/>
</entries>
</pooled-connection-factory>
</jms-connection-factories>
<jms-destinations>
<jms-queue name="testQueue">
<entry name="queue/test"/>
</jms-queue>
<jms-queue name="queue/toServer">
<entry name="queue/toServer"/>
</jms-queue>
<jms-topic name="testTopic">
<entry name="topic/test"/>
</jms-topic>
</jms-destinations>
{code}
Can somebody give me a hint for that?
Do I have to deploy any additional jars for that?
Thanks a lot
Hauke