我是JMS的新手,并尝试使用Glassfish应用服务器执行我的第一个JMS程序。
我在Glassfish管理控制台中创建了连接工厂[jms / MyQueueFactory]和目标资源[jms / myQueue],如下所示:
以下是我的代码:
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.InitialContext;
public class MyReceiver
{
public static void main(String[] args)
{
try
{
InitialContext ctx = new InitialContext();
QueueConnectionFactory f = (QueueConnectionFactory)ctx.lookup("jms/MyQueueFactory"); **// Getting error here**
QueueConnection con = f.createQueueConnection();
con.start();
QueueSession session = con.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Queue t = (Queue)ctx.lookup("jms/myQueue");
QueueReceiver receiver = session.createReceiver(t);
MyListener listner = new MyListener();
receiver.setMessageListener(listner);
System.out.println("Receiver1 is ready, waiting for messages...");
System.out.println("press Ctrl+c to shutdown...");
while(true)
{
Thread.sleep(1000);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
但是当我尝试执行它时会给我以下错误:
javax.naming.NoInitialContextException:需要在中指定类名 环境或系统属性,或作为applet参数,或在 应用程序资源文件:java.naming.factory.initial at javax.naming.spi.NamingManager.getInitialContext(未知来源)at javax.naming.InitialContext.getDefaultInitCtx(未知来源)at javax.naming.InitialContext.getURLOrDefaultInitCtx(未知来源)at at javax.naming.InitialContext.lookup(未知来源)at com.test.MyReceiver.main(MyReceiver.java:16)
请告诉我这里缺少的东西。
感谢。
答案 0 :(得分:0)
由于您是从IDE运行应用程序,因此需要一种连接Glassfish服务器的方法。
为此,您必须在环境变量中设置一些属性,或者您也可以创建属性对象
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
props.put(Context.URL_PKG_PREFIXES, "com.sun.enterprise.naming");
props.put(Context.PROVIDER_URL, "http://localhost:4848/");
InitialContext initialContext;
try {
initialContext = new InitialContext(props);
使用此对象可以初始化上下文。