【问题标题】:JMS Topic context lookup issueJMS 主题上下文查找问题
【发布时间】:2018-02-04 14:31:13
【问题描述】:

我正在尝试在 Websphere Application Server 中使用 JNDI 查找 JMS TopicConnectionFactory。我已经在服务器中正确完成了 jndi 设置。我已经在服务器中部署了我的应用程序。

我为 Sender/Reciever/Listener 设计了 ​​3 个 java 类。然后在服务器中部署 WAR 之后,我首先尝试将 Receiver Code 作为独立的 Java 应用程序运行。但是它失败了,错误为:

线程“main”javax.naming.NoInitialContextException 中的异常:无法使用 javax.naming.spi.NamingManager.getInitialContext(NamingManag‌​er.java:242) 处的哈希表中指定的工厂创建 InitialContext

在下面附上我的代码sn-p:

/**
 * SENDER CLASS
 */
package com.jms.topic;

import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.InitialContext;
import javax.naming.NamingException;



/**
 * @author db2admin
 *
 */
public class JMSTopicSender {

    /**
     * @param args
     * @throws JMSException 
     * @throws NamingException 
     */
    public static void main(String[] args) throws JMSException, NamingException {
        // TODO Auto-generated method stub

        InitialContext ctx=new InitialContext();  
        TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup("myTopicConnectionFactory");  
        TopicConnection con=f.createTopicConnection();  
        con.start(); 

        TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
        Topic t=(Topic)ctx.lookup("myTopic");
        TopicPublisher publisher=ses.createPublisher(t);
        TextMessage msg=ses.createTextMessage();  
        msg.setText("Hello World");

        publisher.publish(msg);
        System.out.println("Message successfully sent.");



    }

}





/**
 *  RECEIVER CLASS
 */
package com.jms.topic;

import javax.jms.Session;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSubscriber;
import javax.jms.TopicSession;
import javax.naming.InitialContext;



/**
 * @author db2admin
 *
 */
public class JMSTopicReciever {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {  
            //1) Create and start connection  
            InitialContext ctx=new InitialContext();  
            TopicConnectionFactory f=(TopicConnectionFactory)ctx.lookup("TCF");  
            TopicConnection con=f.createTopicConnection();  
            con.start();  
            //2) create topic session  
            TopicSession ses=con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);  
            //3) get the Topic object  
            Topic t=(Topic)ctx.lookup("jndi/myTopic");  
            //4)create TopicSubscriber  
            TopicSubscriber receiver=ses.createSubscriber(t);  

            //5) create listener object  
            JMSTopicListener listener=new JMSTopicListener();  

            //6) register the listener object with subscriber  
            receiver.setMessageListener(listener);  

            System.out.println("Subscriber1 is ready, waiting for messages...");  
            System.out.println("press Ctrl+c to shutdown...");  
            while(true){                  
                Thread.sleep(1000);  
            }  
        }catch(Exception e){
            System.out.println(e);
        }

    }

}











/**
 * LISTENER CLASS
 */
package com.jms.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * @author db2admin
 *
 */
public class JMSTopicListener implements MessageListener {

    /**
     * @param args
     */

    @Override
    public void onMessage(Message m) {
        // TODO Auto-generated method stub

        try{  
            TextMessage msg=(TextMessage) m;  
            System.out.println("following message is received:"+msg.getText());  
        }catch(JMSException e){
            System.out.println(e);
        }


    }

}

这是我的 JNDI 连接详细信息:

我在哪里犯错了?

【问题讨论】:

  • 我收到以下错误:线程“main”中的异常 javax.naming.NoInitialContextException: 无法使用 javax.naming.spi.NamingManager.getInitialContext(NamingManager.java 的哈希表中指定的工厂创建 InitialContext :242)
  • @JoshMc : 我已经添加了错误.. 仍然再次粘贴它.. 请参见下文: 线程“main”中的异常 javax.naming.NoInitialContextException: 无法使用创建 InitialContext在 javax.naming.spi.NamingManager.getInitialContext(NamingManag‌​er.java:242 的哈希表中指定的工厂
  • @JoshMc :是的。我已经在 WAS 中部署了应用程序 WAR 文件。然后在尝试将接收器 java 文件作为独立的 java 应用程序运行时,我收到了错误。
  • 不,这并不表示。它部署在 WAS 中,但我也在尝试作为独立的 Java 应用程序运行。

标签: java jms mq jms-topic


【解决方案1】:

已通过 INITIAL_CONTEXT_LOOKUP 解决。

【讨论】:

【解决方案2】:

在 J2SE 中,您需要像这样指定 WAS 使用的初始上下文工厂的类:

Properties env = new Properties();
env.put(Context.PROVIDER_URL,"iiop://<your WAS server>:<port usually 2809>");
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
InitialContext jndi = new InitialContext(env);

Details here

【讨论】:

    猜你喜欢
    • 2011-08-31
    • 2012-12-15
    • 2016-01-29
    • 2013-04-01
    • 2016-02-03
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-31
    相关资源
    最近更新 更多