【问题标题】:Sending JMS message using Java使用 Java 发送 JMS 消息
【发布时间】:2023-06-01 20:11:01
【问题描述】:

您好,我想从我的 JSP 连接并发送一条 JMS 消息到我在安装 Tibco 时安装的 JMS 服务器。现在通过浏览互联网上的各种东西,我知道如何将消息从 JAVA 发送到 JMS 队列,但问题是我不知道如何连接到 JMS 服务器本身。 任何人都可以在这方面帮助我。 谢谢

【问题讨论】:

    标签: java jms tibco


    【解决方案1】:

    您需要在 Java EE 应用服务器上配置它 - WebLogic、JBOSS、Glassfish 等。

    如果您在 Tomcat 或 Jetty 上部署 JSP,并且不使用成熟的 Java EE 应用服务器,则必须向其添加 JMS 模块 - 寻找 ActiveMQ 或 RabbitMQ 或 OpenJMS。

    【讨论】:

      【解决方案2】:

      基本上你需要通过在JNDI目录中查找来获得一个连接工厂,所有其他对象都是从那个连接工厂创建的。

      这是一个示例(来自 JBoss 文档),展示了如何创建主题会话:

      InitialContext iniCtx = new InitialContext();
      Object tmp = iniCtx.lookup("ConnectionFactory");
      TopicConnectionFactory tcf = (TopicConnectionFactory) tmp;
      conn = tcf.createTopicConnection();
      topic = (Topic) iniCtx.lookup("topic/testTopic");
      session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
      conn.start();
      

      更多例子here

      【讨论】:

        【解决方案3】:

        这是一个老话题,但也许它可以提供帮助。

        要从用户界面发送消息(单击按钮),您需要将按钮单击事件映射到 Java 端。然后你可以编写一个java代码来向JMS发送消息。

        要将消息发送到 JMS 队列实际上需要以下内容:

        Context context = null;
        QueueConnection queueConnection = null;
        QueueSession queueSession = null;
        Queue queue;
        

        这就是它的工作原理:

        context = getContext(host, port, user, password);
        queueConnection = getConnectionFactory(context, connectionFactoryJndi);
        queueSession = getQueueSession(queueConnection);
        queue = getQueue(context, queueJndi);
        
        // send a text message
        queueConnection.start();
        String message = "hello";
        sendMessageToQueue(verbose, message, queueSession, queue);
        queueConnection.stop();
        

        要获取你需要连接到服务器的上下文:

        private Context getContext(String host, int port, String user, String password) throws NamingException {
            String url = String.format("%s://%s:%d", protocol, host, port);
        
            Hashtable<String, String> env = new Hashtable<>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
            env.put(Context.PROVIDER_URL, url);
            env.put(Context.SECURITY_PRINCIPAL, user);
            env.put(Context.SECURITY_CREDENTIALS, password);
            return new InitialContext(env);
        }
        

        获取连接工厂:

        private QueueConnection getConnectionFactory(Context context, String jndiName)
                throws NamingException, JMSException {
        
            QueueConnectionFactory connectionFactory = (QueueConnectionFactory) context.lookup(jndiName);
            return connectionFactory.createQueueConnection();
        }
        

        打开一个队列会话:

        private QueueSession getQueueSession(QueueConnection queueConnection) throws JMSException {
            return queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
        }
        

        获取队列:

        private Queue getQueue(Context context, String jndiName) throws NamingException {
            return (Queue) context.lookup(jndiName);
        }
        

        最后,将您的消息发送到队列:

        私有静态 void sendMessageToQueue(boolean verbose, 字符串消息, 队列会话队列会话, 队列队列)抛出 JMSException {

        TextMessage textMessage = queueSession.createTextMessage(message);
        
        try (QueueSender queueSender = queueSession.createSender(queue)) {
            queueSender.send(textMessage);
        }
        

        }

        这些代码 sn-ps 来自这里:https://github.com/zappee/jms-message-sender 这是一个JMS sender命令行工具,可以以本项目为例。

        希望对你有帮助。

        【讨论】: