【问题标题】:client for remote JMS queue远程 JMS 队列的客户端
【发布时间】:2013-06-21 00:01:45
【问题描述】:

我在远程 glassfish 服务器上配置了一个 JMS 队列。我正在尝试从我的本地机器连接这个队列。是否可以直接连接到该服务器,或者我需要通过一些经纪人/代理进行连接?它是如何工作的? (我是jms区的新手) 非常感谢

【问题讨论】:

    标签: java glassfish jms glassfish-3


    【解决方案1】:

    我没有使用 Glassfish 的经验,但是这个场景确实适用于 JBoss(它集成了 JBossMQ),它应该也普遍适用:

    服务器:

    • 服务器配置:创建队列,并将其绑定到在 JNDI 中可见的名称
    • 服务器配置:确保连接工厂在 JNDI 中也是可见的

    客户:

    • 使用 JNDI 查找连接工厂和队列。这可能需要将一些值放入InitialContext 的属性中
    • 在连接工厂和队列之上,您可以构建其他对象(队列连接/会话/接收器)。

    JBoss 是这样的:

        final Properties initialContextProperties = new Properties();
        initialContextProperties.put("java.naming.factory.initial",
                "org.jnp.interfaces.NamingContextFactory");
        initialContextProperties.put("java.naming.provider.url",
                "jnp://localhost:1099");
    
        //
    
        final InitialContext ic = new InitialContext(initialContextProperties);
    
        final QueueConnectionFactory qcf = (QueueConnectionFactory) ic
                .lookup("XAConnectionFactory");
        final Queue queue = (Queue) ic.lookup("queue/A");
    

    所以要通过的代理/代理是 JNDI。

    【讨论】:

      【解决方案2】:

      您的客户端应用程序是否在本地 glassfish 实例中运行并尝试连接到远程 glassfish 实例的 JMS 资源?

      如果是,那么我找到了两种方法来做到这一点。对于这两个选项,在远程和本地 glassfish 实例中设置相同的连接工厂和目标(队列)JMS 资源。

      1)设置jms连接工厂属性“addressList”

      在客户端 glassfish 管理控制台中转到 Resources->JMS Resources->Connection Factories->jms/YourConnectionFactory->Additional Properties

      添加一个名为 addressList 和值 XX.XX.XX.XX:YYYY 的附加属性 其中值是远程机器的 IP 地址和运行 JMS 服务的端口号。

      2) 设置客户端 glassfish Java 消息服务连接到远程 glassfish

      在客户端 glassfish 管理控制台中转到Configurations->server-config->Java Message Service

      • 设置 JMS 服务类型:REMOTE(点击保存)
      • 设置 JMS Hosts->default_JMS_host IP 地址和端口为远程 glassfish JMS 服务的 IP 地址和端口

      我已经测试了与 Glassfish 4 一起使用的两个选项。希望它有所帮助。

      【讨论】:

        【解决方案3】:

        如果您的客户端应用程序在 Glassfish 之外运行,这里是一个开放 mq 客户端的简单代码示例。

        要让它工作,您需要从 glassfishInstall/mq/lib 目录中引用 2 个 openmq jar - imq.jar 和 jms.jar

        import com.sun.messaging.ConnectionConfiguration;
        import com.sun.messaging.ConnectionFactory;
        import com.sun.messaging.Queue;
        import javax.jms.Connection;
        import javax.jms.JMSException;
        import javax.jms.Message;
        import javax.jms.MessageProducer;
        import javax.jms.Session;
        
        public class TestJmsClientStandalone2 {
        
            public static void main( String[] args ) throws JMSException
            {
                ConnectionFactory connFactory = new ConnectionFactory();
                connFactory.setProperty(ConnectionConfiguration.imqAddressList, "remotehostip:7676");
        
                Queue myQueue = new Queue("myRemoteQueue");
        
                try (Connection connection = connFactory.createConnection(); 
                        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
                        MessageProducer producer = session.createProducer(myQueue)) {
        
                    Message message = session.createTextMessage("this is my test message");
                    producer.send(message);
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2015-03-13
          • 2012-07-28
          • 1970-01-01
          • 2012-12-19
          • 2010-12-26
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          • 2015-01-20
          相关资源
          最近更新 更多