当前位置: 首页 > 知识库问答 >
问题:

JMS主题上下文查找问题

洪凯定
2023-03-14

我试图查找一个JMS TopicConnectionFactory使用JNDI在WebSphere应用服务器。我已经在服务器中正确地完成了jndi设置。我已经在服务器中部署了我的应用程序。

我为发送方/接收方/监听器设计了3个java类。在服务器中部署WAR之后,我首先尝试将接收器代码作为独立的java应用程序运行。然而,它失败了,错误如下:

线程“main”javax中出现异常。命名。NoInitialContextException:无法使用javax的哈希表中指定的工厂创建InitialContext。命名。spi。纳明经理。getInitialContext(NamingManag)‌​呃。爪哇:242)

下面附上我的代码片段:

/**
 * 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连接详细信息:

我在哪里犯了错误?

共有2个答案

谷梁镜
2023-03-14

用INITIAL_CONTEXT_LOOKUP解决。

印季
2023-03-14

在J2SE中,您需要指定初始上下文工厂使用的类,如下所示:

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);

这里有详细信息

 类似资料:
  • 代码错误: py4j。协议Py4JJavaError:调用o490时出错。collectToPython.:组织。阿帕奇。火花SparkException:作业因阶段失败而中止:阶段27.0中的任务0失败了4次,最近的失败:阶段27.0中的任务0.3丢失(TID 98)(172.17.7.28执行器1):java。io。IOException:无法运行程序“python3.6”:CreatePro

  • 我有一个Web项目,其中有几个EJB在不同的包中。但是我在查找EJB时遇到了问题。 我的目录结构:有两个包索引。作业和索引。ejb。 --包index.job有一个POJOindex.java --包装索引。ejb有一个由@Stateless(name=“indexEJB”,mappedName=“indexEJB”)和@LocalBean定义的ejb --包装索引。ejb还有一个定义为“本地”的

  • 我有以下... 也试过... 这是WAS6-8.5的一个港口项目

  • 问题内容: 我想构建我的Flask应用,例如: 是flask蓝图。 现在,为了创建模型类,我需要拥有该应用程序,例如: 但是,如果我尝试将该模型导入到我的应用程序中,则会感到恐惧。我如何在这里正确持有我的应用程序?相对导入可能有效,但是它们很丑陋,并且具有自己的上下文问题,例如: 问题答案: 该模块没有要与应用程序马上初始化-你可以这样做,而不是: 然后在应用程序设置中,你可以调用init_app

  • 正在执行热重启。..正在将文件同步到设备sdk gphone x86 arm...在1,910毫秒内重新启动应用程序。 widgets library捕获异常widgets library捕获异常widgets library捕获异常widgets library捕获异常widgets library捕获异常widgets library捕获异常widgets library捕获异常widgets

  • 主要内容:创建JMeter测试计划,添加JMS订阅服务器和发布服务器,添加监听器,保存并执行测试计划,验证输出现在编写一个JMeter测试计划来测试JMS提供程序。 对于此测试,我们必须创建一个订阅者和一个发布者。 创建JMeter测试计划 进入到JMeter/bin文件夹,双击文件以启动JMeter界面。 单击“Test Plan”节点。 将此测试计划节点重命名为JMS_topic_test。 选择JMS_topic_test 节点,然后右键单击所选项。 鼠标悬停在“Add”选项上,然后将显示