user1421324
user1421324

Reputation: 169

WebSphere Liberty: Intermediate context does not exist: jms/<connection factory jndi>

I'm running into a problem while trying to send an xml message to a JMS queue via jndi lookup on Liberty 20.0.0.1.

My server.xml is:

<?xml version="1.0" encoding="UTF-8"?>
<server description="Default server">
    <featureManager>
        <feature>el-3.0</feature>
        <feature>localConnector-1.0</feature>
        <feature>monitor-1.0</feature>
        <feature>restConnector-2.0</feature>
        <feature>jacc-1.5</feature>
        <feature>servlet-4.0</feature>
        <feature>jndi-1.0</feature>
        <feature>concurrent-1.0</feature>
        <feature>requestTiming-1.0</feature>
        <feature>ssl-1.0</feature>
        <feature>jdbc-4.0</feature>
        <feature>cdi-2.0</feature>
        <feature>jms-2.0</feature>
        <feature>jaxrs-2.1</feature>
        <feature>ejbLite-3.2</feature>
    </featureManager>

    <httpEndpoint id="defaultHttpEndpoint"
              host="*"
              httpPort="9080"
              httpsPort="9443" />

    <!-- Automatically expand WAR files and EAR files-->
    <applicationManager autoExpand="true"/>
    <applicationMonitor updateTrigger="mbean"/>

    <messagingEngine>
        <queue id="jmsQueue" forceReliability="ReliablePersistent" maxMessageDepth="5000"></queue>
    </messagingEngine>

    <jmsQueueConnectionFactory jndiName="jms/JMS_CF" connectionManagerRef="ConMgr">
        <properties.wasJms
            nonPersistentMapping="ExpressNonPersistent"
            persistentMapping="ReliablePersistent"/>
    </jmsQueueConnectionFactory>

    <connectionManager id="ConMgr" maxPoolSize="10"/>

    <jmsQueue id="jms_StockQueue" jndiName="jms/STOCK_JMS_QUEUE">
        <properties.wasJms queueName="stockQueue"
            deliveryMode="Application"
            timeToLive="500000"
            priority="1"
            readAhead="AsConnection" />
    </jmsQueue>

    <jmsActivationSpec id="core_indexing/jms-mdb/StockMDB">
        <properties.wasJms destinationRef="jms_StockQueue" />
    </jmsActivationSpec>
</server>

and my Java (non-ejb class) code is:

final InitialContext context = new InitialContext();
final QueueConnectionFactory qcf = (QueueConnectionFactory) context.lookup("jms/JMS_CF");
final Queue destination = (Queue) context.lookup("jms/STOCK_JMS_QUEUE");
queueConnection = qcf.createQueueConnection();
queueSession = queueConnection.createQueueSession(false, 0);
final ObjectMessage message = queueSession.createObjectMessage(object);
queueSender = queueSession.createSender(destination);
queueSender.send(message);

However when I run tests against this in-container code I'm getting:

Intermediate context does not exist: jms/JMS_CF
javax.naming.NameNotFoundException: Intermediate context does not exist: jms/JMS_CF
at com.ibm.ws.jndi.internal.ContextNode.getTargetNode(ContextNode.java:125) ~[?:?]
at com.ibm.ws.jndi.internal.ContextNode.lookup(ContextNode.java:211) ~[?:?]
at com.ibm.ws.jndi.internal.WSContext.lookup(WSContext.java:306) ~[?:?]
at com.ibm.ws.jndi.WSContextBase.lookup(WSContextBase.java:61) ~[?:?]
at org.apache.aries.jndi.DelegateContext.lookup(DelegateContext.java:161) ~[?:?]
at javax.naming.InitialContext.lookup(InitialContext.java:428) ~[?:1.8.0]

If I change the Java code so that the connection factory lookup is done with @Resource i.e.

@Resource(lookup = "jms/JMS_CF")
private QueueConnectionFactory queueConnectionFactory;

the error is:

[ERROR   ] SRVE0315E: An exception occurred: java.lang.Throwable: 
javax.ejb.EJBException: CWNEN0030E: The server was unable to obtain an object 
instance for the 
java:comp/env/com.xyz.www.stock.api.ws.StockWS/queueConnectionFactory 
reference.  The exception message was: CWNEN1003E: The server was unable to 
find the jms/JMS_CF binding with the javax.jms.QueueConnectionFactory type 
for the java:comp/env/com.xyz.www.stock.api.ws.StockWS/queueConnectionFactory
reference.

Replacing jms-2.0 with wasJmsServer-1.0 and wasJmsClient-2.0 gets rid of the JNDI lookup error but the MDB won't activate.

Upvotes: 1

Views: 4546

Answers (2)

Sam
Sam

Reputation: 42337

I also got this error despite the <jmsQueueConnectionFactory> having the exact JNDI name that the app was looking for.

Turned out the problem was the connection factory was configured to use IBM WebSphere MQ, which wasn't available in Open Liberty. After following the steps at Is there a "feature" in Open Liberty to connect to IBM MQ, equivalent to wmqJmsClient-2.0 in Liberty Profile?, the error went away.

Upvotes: 0

user1421324
user1421324

Reputation: 169

Sorted!

Replaced

<feature>jms-2.0</feature>

with

<feature>wasJmsServer-1.0</feature>
<feature>wasJmsClient-2.0</feature>
<feature>mdb-3.2</feature>

Upvotes: 2

Related Questions