简体   繁体   中英

JMS ConnectionFactory NullPointerException in Consumer Application

I have one application that functions as a server and pushes questions / answers to a JMS Queue at regular intervals, this part works fine.

What I'd like to do is consume the messages sent to this queue in a dedicated application, however when I try to access my ConnectionFactory I always get a NullPointerException when I try to invoke the method "CreateContext".

    public class Consumer {

    /**
     * @param args the command line arguments
     */


    @Resource(lookup = "jms/__defaultConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(lookup = "jms/QuizQueue")
    private static Queue queue;
    private static Map<String, Map<String, Boolean>> map;
    private static Quiz quiz = new Quiz();
    //private static JMSContext ctx;

    public static void main(String[] args) {
        boolean first = false;
        int qid = 0;      
        map = new HashMap();
        try(JMSContext ctx = connectionFactory.createContext();){
        JMSConsumer m = ctx.createConsumer(queue);
        while(true) {
            Message msg = m.receive(100000);
... Do  something with the msg ...

Exception:

Exception occurred: java.lang.NullPointerException
java.lang.NullPointerException
    at com.sun.enterprise.resource.pool.PoolManagerImpl.getResourceFromPool(PoolManagerImpl.java:245)
    at com.sun.enterprise.resource.pool.PoolManagerImpl.getResource(PoolManagerImpl.java:170)
    at com.sun.enterprise.connectors.ConnectionManagerImpl.getResource(ConnectionManagerImpl.java:354)
    at com.sun.enterprise.connectors.ConnectionManagerImpl.internalGetConnection(ConnectionManagerImpl.java:307)
    at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:242)
    at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:171)
    at com.sun.enterprise.connectors.ConnectionManagerImpl.allocateConnection(ConnectionManagerImpl.java:166)
    at com.sun.messaging.jms.ra.ConnectionFactoryAdapter._allocateConnection(ConnectionFactoryAdapter.java:204)
    at com.sun.messaging.jms.ra.ConnectionFactoryAdapter.createConnection(ConnectionFactoryAdapter.java:162)
    at com.sun.messaging.jms.ra.ConnectionFactoryAdapter.createConnection(ConnectionFactoryAdapter.java:144)
    at com.sun.messaging.jmq.jmsclient.JMSContextImpl.<init>(JMSContextImpl.java:163)
    at com.sun.messaging.jms.ra.ConnectionFactoryAdapter.createContext(ConnectionFactoryAdapter.java:167)
    at quizconsumer.Consumer.main(Consumer.java:48)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
    at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)

I have no idea what is causing this exception, it seems the lookup did work and the "connectionFactory" object is not null, but something goes wrong when the createContext method is called.

If you are trying to run your application outside container, the injectable properties will not work. Instead you have to do manual JNDI looks for ConnectionFactory and Queue.

For example:

final InitialContext ic = new InitialContext(contextProperties);

final QueueConnectionFactory factory = (QueueConnectionFactory) ic.lookup(factory);
final Queue queue = (Queue) ic.lookup(queueName);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM