从独立客户端连接到远程JMS队列时出现问题
我是JMS新手,从独立客户端连接到远程JMS队列时遇到问题。如有任何关于解决此问题的提示,我们将不胜感激 现在,我有一个在多个客户端上运行的JavaFX独立应用程序和一个在远程Unix机器上运行的glassfish server 3.1.2.2。我很难将独立应用程序中的消息推送到服务器上的队列中 客户端Mc:Windows PC(未安装服务器) 远程Mc:Unix(已安装GlassFish 3.1.2.2) 服务器上的JMS资源:从独立客户端连接到远程JMS队列时出现问题,jms,Jms,我是JMS新手,从独立客户端连接到远程JMS队列时遇到问题。如有任何关于解决此问题的提示,我们将不胜感激 现在,我有一个在多个客户端上运行的JavaFX独立应用程序和一个在远程Unix机器上运行的glassfish server 3.1.2.2。我很难将独立应用程序中的消息推送到服务器上的队列中 客户端Mc:Windows PC(未安装服务器) 远程Mc:Unix(已安装GlassFish 3.1.2.2) 服务器上的JMS资源: JMSServiceLocator jmsLocator = J
JMSServiceLocator jmsLocator = JMSServiceLocator.getInstance();
QueueConnectionFactory qConnFactory = jmsLocator.getQueueConnectionFactory();
qConnection = qConnFactory.createQueueConnection();
session = qConnection.createSession(false, ession.AUTO_ACKNOWLEDGE);
queue = jmsLocator.getQueue();
// Push and publish the message
messageProducer = session.createProducer(queue);
textMessage = session.createTextMessage();
textMessage.setText(message);
messageProducer.send(textMessage);
JMS目标资源
JNDI名称:jms/ReferralQueue物理目的地名称:ReferralQueue
资源类型:javax.jms.Queue JMS连接工厂 池名称:jms/ReferralConnectionFactory
JNDI名称:jms/ReferralConnectionFactory
资源类型:javax.jms.QueueConnectionFactory JMS服务类型:嵌入式
JMS消息存储类型:文件 连接到服务器的客户端代码:
JMSServiceLocator jmsLocator = JMSServiceLocator.getInstance();
QueueConnectionFactory qConnFactory = jmsLocator.getQueueConnectionFactory();
qConnection = qConnFactory.createQueueConnection();
session = qConnection.createSession(false, ession.AUTO_ACKNOWLEDGE);
queue = jmsLocator.getQueue();
// Push and publish the message
messageProducer = session.createProducer(queue);
textMessage = session.createTextMessage();
textMessage.setText(message);
messageProducer.send(textMessage);
jms.properties:
org.omg.CORBA.ORBInitialHost=UNIX MC URLorg.omg.CORBA.ORBInitialPort=7676 实现资源缓存的服务定位器设计
public class JMSServiceLocator {
private static JMSServiceLocator singletonService = null;
private static QueueConnectionFactory qFactory;
private static Queue queue;
private InitialContext context;
private static Properties properties = new Properties();
private Map cache;
static {
try {
singletonService = new JMSServiceLocator();
} catch (Exception e) {
//error handling
}
}
private JMSServiceLocator() {
try {
loadProperties();
context = new InitialContext(properties);
cache = Collections.synchronizedMap(new HashMap());
} catch (Exception e) {
//error handling
}
}
public static JMSServiceLocator getInstance() {
return singletonService;
}
public QueueConnectionFactory getQueueConnectionFactory() {
String qConnFactoryName = "jms/ReferralConnectionFactory";
qFactory = null;
try {
System.out.println("/********************Comment after Testing*****************************/");
Hashtable env = context.getEnvironment();
System.out.println("**env.size::" + env.size());
Enumeration names = env.keys();
while (names.hasMoreElements()) {
String str = (String) names.nextElement();
System.out.println("**" + str + "=" + env.get(str));
}
System.out.println("/**********************************************************************/");
if (cache.containsKey(qConnFactoryName)) {
qFactory = (QueueConnectionFactory) cache.get(qConnFactoryName);
} else {
qFactory = (QueueConnectionFactory) context.lookup(qConnFactoryName);
cache.put(qConnFactoryName, qFactory);
}
} catch (Exception e) {
//error handling
}
return qFactory;
}
public Queue getQueue() {
String queueName = "jms/ReferralQueue";
queue = null;
try {
if (cache.containsKey(queueName)) {
queue = (Queue) cache.get(queueName);
} else {
queue = (Queue) context.lookup(queueName);
cache.put(queueName, queue);
}
} catch (Exception e) {
//error handling
}
return queue;
}
private static void loadProperties() {
//Load jms properties
}
}
最终向服务器发送消息:
JMSServiceLocator jmsLocator = JMSServiceLocator.getInstance();
QueueConnectionFactory qConnFactory = jmsLocator.getQueueConnectionFactory();
qConnection = qConnFactory.createQueueConnection();
session = qConnection.createSession(false, ession.AUTO_ACKNOWLEDGE);
queue = jmsLocator.getQueue();
// Push and publish the message
messageProducer = session.createProducer(queue);
textMessage = session.createTextMessage();
textMessage.setText(message);
messageProducer.send(textMessage);
嗯。。。现在我观察到一种奇怪的行为
我在客户机上创建了一个新的GlassFish 3.1.2.2服务器实例,没有jndi,没有连接工厂,也没有jms队列
我已经启动了这个服务器实例并执行了独立客户端应用程序。奇怪的是,一切正常,消息被直接推送到远程队列
有没有人遇到过这样的问题?我怀疑应用程序可能只是在服务器实例(可能是任何随机实例,完全无关)启动时才在类路径中加载依赖的GlassFish JAR
我的独立应用程序类路径中有以下JAR:
*C:\ProgramFiles\glassfish-3.1.2.2\glassfish\lib\gf-client.jar
*C:\ProgramFiles\glassfish-3.1.2.2\glassfish\lib\appserv-rt.jar
*C:\ProgramFiles\glassfish-3.1.2.2\glassfish\lib\install\applications\jmsra\imqbroker.jar
*C:\ProgramFiles\glassfish-3.1.2.2\glassfish\lib\install\applications\jmsra\imqjmsra.jar
我也在论坛和论坛上发布了这个,但还没有解决方案。在此问题上的任何帮助都将不胜感激
谢谢。我想你现在已经知道问题出在哪里了: 客户端上缺少JMS客户端JAR(客户端Mc:Windows PC(未安装服务器))
您不需要在客户端上安装完整的Glassfish,只需要安装JMS客户端jar(gf client.jar)以及gf client.jar引用的所有其他jar。谢谢Gonzalez!我能够解决这个问题。在启动客户端的VM时,我只需将初始主机属性设置为远程URL。很高兴听到这有帮助。如果答案对你有用,不要忘记投票或接受。