JMS 主题上下文查找问题
JMS Topic context lookup issue
我正在尝试在 Websphere Application Server 中使用 JNDI 查找 JMS TopicConnectionFactory。我已经在服务器中正确地完成了 jndi 设置。我已经在服务器中部署了我的应用程序。
我为Sender/Reciever/Listener设计了3个java类。然后在服务器中部署 WAR 之后,我首先尝试 运行 接收器代码作为独立的 java 应用程序。但是它失败并出现错误:
Exception in thread "main" javax.naming.NoInitialContextException: Failed to create InitialContext using factory specified in hashtable at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java: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 连接详细信息:
我哪里出错了?
在 J2SE 中,您需要像这样指定 WAS 使用的初始上下文工厂的 class :
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);
已解决 INITIAL_CONTEXT_LOOKUP。
我正在尝试在 Websphere Application Server 中使用 JNDI 查找 JMS TopicConnectionFactory。我已经在服务器中正确地完成了 jndi 设置。我已经在服务器中部署了我的应用程序。
我为Sender/Reciever/Listener设计了3个java类。然后在服务器中部署 WAR 之后,我首先尝试 运行 接收器代码作为独立的 java 应用程序。但是它失败并出现错误:
Exception in thread "main" javax.naming.NoInitialContextException: Failed to create InitialContext using factory specified in hashtable at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java: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 连接详细信息:
我哪里出错了?
在 J2SE 中,您需要像这样指定 WAS 使用的初始上下文工厂的 class :
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);
已解决 INITIAL_CONTEXT_LOOKUP。