jms - 从独立客户端连接到远程 JMS 队列时出现问题

标签 jms

我是 JMS 新手,在从我的独立客户端连接到远程 JMS 队列时遇到问题。非常感谢有关解决此问题的任何提示。

现在我有一个在多个客户端上运行的 JavaFX 独立应用程序和一个在远程 Unix 机器上运行的 glassfish 服务器 3.1.2.2。我很难将消息从我的独立应用程序推送到驻留在服务器上的队列。

客户端 Mc:Windows PC(未安装服务器) 远程 Mc:Unix(已安装 GlassFish 3.1.2.2)

服务器上的 JMS 资源:

JMS 目标资源

JNDI 名称:jms/ReferralQueue
物理目标名称:ReferralQueue
资源类型:javax.jms.Queue

JMS 连接工厂

池名称:jms/ReferralConnectionFactory
JNDI 名称:jms/ReferralConnectionFactory
资源类型:javax.jms.QueueConnectionFactory

JMS 服务类型:嵌入式
JMS 消息存储类型:文件

连接到服务器的客户端代码:

jms.properties:

org.omg.CORBA.ORBInitialHost=UNIX MC URL
org.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:\Program Files\glassfish-3.1.2.2\glassfish\lib\gf-client.jar *C:\Program Files\glassfish-3.1.2.2\glassfish\lib\appserv-rt.jar *C:\Program Files\glassfish-3.1.2.2\glassfish\lib\install\applications\jmsra\imqbroker.jar *C:\Program Files\glassfish-3.1.2.2\glassfish\lib\install\applications\jmsra\imqjmsra.jar

我还在 Oracle JMS 上发布了这个和 GlassFish论坛,还没有解决办法。对此问题的任何帮助将不胜感激。

谢谢。

最佳答案

我想你现在已经知道问题出在哪里了:

客户端缺少 JMS 客户端 jar(客户端 Mc:Windows PC(未安装服务器))。

您不需要在客户端上安装完整的 Glassfish,只需要 JMS 客户端 jar (gf-client.jar) 加上 gf-client.jar 引用的所有其他 jar。

关于jms - 从独立客户端连接到远程 JMS 队列时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14163074/

相关文章:

Java内部消息队列/JMS

java - 使用 Java 监控队列

java - 如何用java连接MQ并发送数据

java - ActiveMQ:在没有代理的情况下启动消费者

java - Apache Camel JMS 内存泄漏?

java - ActiveMQ 中代理的动态名称,可在同一台计算机上运行 2 个或多个实例

java - 使用 JMS 进行简单聊天

java - 为 ActiveMQ JMS 连接使用用户名和密码

java - 使用 spring 集成确保关闭 jms 消费者的正确方法是什么?

java - 谁将首先接收消息虚拟主题订阅者或逻辑队列消费者?