【问题标题】:ActiveMQ, WebSocket and StompActiveMQ、WebSocket 和 Stomp
【发布时间】:2015-04-06 11:23:30
【问题描述】:

我无法编写一个通过 WebSocket 侦听 STOMP 消息的服务器。我的问题在于 stomp 协议和 JMS 消费者的创建。

以下代码在 createConnection 上失败

class StompDemo {
  val uri = "ws://localhost:61614"
  val topicName = "mytopic"
  val broker = new BrokerService
  broker.addConnector(uri)
  val topic = new ActiveMQTopic(topicName)
  val topics = Array[ActiveMQDestination](topic)
  broker.setDestinations(topics)
  broker.start
  println("Started broker")

  val connectionFactory = new ActiveMQConnectionFactory(uri)
  val connection = connectionFactory.createConnection
  println("Started connection")

  val session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
  val destination = session.createTopic(topicName)
  val consumer = session.createConsumer(destination)
  println("Created consumer")

  while(true) {
    println("Waiting for next message")
    val message = consumer.receive
  }
}

以下例外:

Could not create Transport. Reason: java.io.IOException: createTransport() method not implemented!

你能指出这段代码的问题吗? 如何使用 AMQ 通过 WebSocket/Stomp 以编程方式将 JMS 侦听器配置到队列或主题?

谢谢

新更新的代码因 ActiveMQ 传输失败:tcp:///127.0.0.1:51309@6969 [] 传输连接到:tcp://127.0.0.1:51309 失败:java.io.IOException:未知数据类型: 47 我想它必须与基于二进制与基于文本的关系。

仍在调查失败的原因:

package org.tj.amq

import org.apache.activemq.broker.BrokerService
import org.apache.activemq.ActiveMQConnectionFactory
import javax.jms.Session
import javax.jms.TextMessage

//
// http://www.massapi.com/class/br/BrokerService.html
//

object AMQStompDemo extends MainLoop with Logging {
  <<("AMQ Stomp Demo")
  val uri = "tcp://localhost:6969"
  val broker = new BrokerService
  broker.setPersistent(false)
  broker.setUseJmx(false)
  broker.addConnector(uri)
  broker.start
  <<("Started broker")

  val connectionFactory = new ActiveMQConnectionFactory(uri)
  val connection = connectionFactory.createConnection
  connection.start
  <<("Started connection")
  val session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE)
  val destination = session.createQueue("test")
  val consumer = session.createConsumer(destination)

  while(true) {
    <<("Ready to receive next message ...")
    val message = consumer.receive
    message match {
      case tm:TextMessage => <<(s"Received text message ${tm.getText}")
      case _ => <<(s"Received another message type $message")
    }
  }

  def main(args: Array[String]): Unit = {}
}

trait Logging {
  def <<(any : => Any) = println(s"${Thread.currentThread().getName} $any")
}

trait MainLoop extends Logging {
  new Thread(new Runnable() {
    override def run = {
      <<("Starting main loop")
      while(true) {
        Thread.sleep(1000)
      }
    }
  }).start
}

传奇还在继续。 只需添加broker.addConnector("ws://localhost:6971") 我可以通过WS从浏览器成功连接到队列/queue/test

现在,最后一个问题 - 我确实收到了回调,但 AMQ 给了我这个

[WARN] 07 Feb 04:54:26 PM qtp1458849419-25 [] Transport Connection to: StompSocket_984548082 failed: java.io.IOException
Exception in thread "ActiveMQ InactivityMonitor Worker" java.lang.NullPointerException
    at org.apache.activemq.transport.AbstractInactivityMonitor.onException(AbstractInactivityMonitor.java:314)
    at org.apache.activemq.transport.AbstractInactivityMonitor$4.run(AbstractInactivityMonitor.java:215)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

就在收到第一条消息之后。

[已编辑] 嗯,我被https://issues.apache.org/jira/browse/AMQ-5155击中了 因此,使用 AMQ 版本 5.9.0 可以工作。

我的感觉是 AMQ for WebSockets 太不稳定了。好吧,可能对 Tomcat 使用了更保守的方法。

【问题讨论】:

    标签: websocket activemq stomp


    【解决方案1】:

    通常您不会在服务器端使用 websocket,只需使用普通的 STOMP 或 OpenWire 连接即可。

    那个 siad,看看你的代码,你似乎在使用 ActiveMQ JMS 客户端,它既不讲 STOMP 也不讲 Websockets,所以你注定要失败。 ActiveMQ JMS 客户端使用 OpenWire 协议,可以通过 TCP 或 SSL 连接(HTTP 可以使用正确的 jar)。

    【讨论】:

    • 谢谢。因此,您说的是有效地使用 tcp:// 而不是 ws://,这现在很有意义,只需使用 Web 套接字库通过普通 stomp 连接,我就可以排序了。对吗?
    • 是的,Java 客户端需要使用 tcp:// 或 ssl://。如果您需要从浏览器连接,请使用可以执行 websockets 的基于 stomp 的库,确保代理具有 ws 或 wss 传输来执行此操作。
    • 嗨蒂姆。我按照你的建议做了:基本上在 tcp://localhost:6969 上启动了代理和连接,并使用了来自 apache-activemq-5.11.0\webapps-demo\demo\websocket 的一个 Web 客户端 - 当我连接到 ws:/ /localhost:6969 向 /queue/test 发送消息(我的代码监听测试 - 浏览器告诉我哎呀!失去与 ws://localhost:6969/ 和服务器端 tcp:///127.0.0.1 的连接: 51114@6969 [] 传输连接到:tcp://127.0.0.1:51114 失败:java.io.IOException:未知数据类型:47 ..有什么建议吗?
    • 只是在重新阅读您的答案后澄清一下:客户端是 stomp + websockets,对于 Java、浏览器、C++ .. 没关系,但服务器是 vm 中的 Java/Scala 启动代理。跨度>
    • 实时成功 ;-) 谢谢蒂姆 - 你让我走上了正确的道路。用工作解决方案更新上面的代码
    猜你喜欢
    • 2012-11-03
    • 1970-01-01
    • 2022-12-15
    • 2016-07-04
    • 2016-11-09
    • 2013-02-02
    • 2015-07-08
    • 2018-10-31
    • 2015-07-02
    相关资源
    最近更新 更多