【问题标题】:Cause: Broker: localhost - Client: tata_consumer already connected from tcp://127.0.0.1:52917原因:代理:localhost - 客户端:tata_consumer 已从 tcp://127.0.0.1:52917 连接
【发布时间】:2020-08-17 20:06:42
【问题描述】:

我是 ActiveMQ 的新手,正在尝试尝试主题的工作。我创建了一个使用 JMS 的生产者和两个使用 Spring 配置的消费者侦听器。我确实知道,如果使用多个消费者,那么每个消费者都应该有一个唯一的客户端 ID。即使在保持客户端 ID 的唯一性之后,我也会收到相同的错误。

ERROR | Could not refresh JMS Connection for destination 'hetal_rachh_topic' - retrying using FixedBackOff{interval=5000, currentAttempts=4, maxAttempts=unlimited}. Cause: Broker: localhost - Client: tata_consumer already connected from tcp://127.0.0.1:52917
ERROR | Could not refresh JMS Connection for destination 'hetal_rachh_topic' - retrying using FixedBackOff{interval=5000, currentAttempts=4, maxAttempts=unlimited}. Cause: Broker: localhost - Client: cipla_consumer already connected from tcp://127.0.0.1:52918

注意:我什至尝试只创建一个 JMS 侦听器容器,但错误仍然表明特定客户端已连接。

我正在尝试做的步骤 -

  1. 使用具有两个 API 的 REST 控制器创建了一个 maven 项目。第一个 API 只是初始化一个数组列表。第二个 API 调用生产者,该生产者使用 JMSTemplate 向主题发送消息。
  2. 在 spring 上下文文件中只配置了一个 JMS 监听器
  3. UI 代码使用 axios 调用第一个 API 来初始化一些 arraylist。然后在每个间隔之后,调用第二个 API,该 API 调用生产者发送消息,这些消息被侦听器进一步消费。控制器(第二个 API)基本上将接收到的消息的 JSON 字符串返回给 UI。
  4. 我没有在本地使用任何 Web 服务器,而是使用 tomcat7 插件来运行我的 spring 项目mvn tomcat7:run。我启动本地 AMQ 服务器 activemq start 并使用 npm start 启动我的 UI 代码

下面是我的 ReactJs UI 代码 sn-p,它会调用 axios。

componentDidMount() {
    this.callCreateConnection();
    this.interval = setInterval(this.callStockUpdatesAPI, 15000);
  }

  componentWillUnmount() {
    clearInterval(this.interval);
  }

  async callCreateConnection() {
    await axios
      .get("http://localhost:8080/stock-market-ticker/createConnection", {
        headers: {
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET",
        },
      })
      .then((res) => {
        console.log("Response", res.data);
      })
      .catch((error) => {
        console.log("Error", error);
      });
  }

  async callStockUpdatesAPI() {
    console.log("Inside api");
    await axios
      .get("http://localhost:8080/stock-market-ticker/getStockUpdates", {
        headers: {
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Methods": "GET",
        },
      })
      .then((response) => {
        console.log("Response", response.data);
        switch (response.data.symbol) {
          case "TATAMOTORS":
            let oldData_tata = { ...this.state.data };

            oldData_tata[0].price = response.data.price;
            oldData_tata[0].percent_change_1h = response.data.change_1hr;
            oldData_tata[0].percent_change_24h = response.data.change_24hr;
            this.setState({ data: oldData_tata });

            break;
          case "CIPLA":
            let oldData_cipla = { ...this.state.data };
            oldData_cipla[0].price = response.data.price;
            oldData_cipla[0].percent_change_1h = response.data.change_1hr;
            oldData_cipla[0].percent_change_24h = response.data.change_24hr;
            this.setState({ data: oldData_cipla });

            break;
          case "ASIANPAINT":
            let oldData_asian = { ...this.state.data };
            oldData_asian[1].price = response.data.price;
            oldData_asian[1].percent_change_1h = response.data.change_1hr;
            oldData_asian[1].percent_change_24h = response.data.change_24hr;
            this.setState({ data: oldData_asian });

            break;
          default:
            return;
        }
      })
      .catch((error) => {
        console.log("Error", error);
      });
 }

我在https://github.com/hetalrachh/stock-market-ticker 分享了我的 Spring 应用程序代码。

我该如何解决这个问题?如果有人可以提供帮助。提前致谢。

【问题讨论】:

    标签: java activemq spring-jms jms-topic


    【解决方案1】:

    我认为问题在于每个 Spring listener-container 都在创建 多个 侦听器,并且这些多个侦听器中的每一个都使用来自其父容器的相同 client-id 值。 JMS 规范不允许这样做。尝试在 listener-container 元素上使用 concurrency="1",例如:

        <jms:listener-container acknowledge="auto"
            connection-factory="connectionFactory" destination-type="durableTopic"
            client-id="tata_consumer" concurrency="1">
            <jms:listener destination="hetal_rachh_topic" ref="tataConsumer"
                method="onMessage" subscription="subscription" selector="symbol=TATAMOTORS" />
        </jms:listener-container>
    
        <jms:listener-container acknowledge="auto"
            connection-factory="connectionFactory" destination-type="durableTopic"
            client-id="cipla_consumer" concurrency="1">
            <jms:listener destination="hetal_rachh_topic" ref="ciplaConsumer"
                method="onMessage" subscription="subscription" selector="symbol=CIPLA" />
        </jms:listener-container>
    
    

    【讨论】:

    • 我为每个容器只创建了一个监听器。为什么要创建多个侦听器? @贾斯汀伯特伦
    • 您收到的错误消息表明并非如此。意思是tata_consumercipla_consumer 都“已连接”。如果每个容器只有一个侦听器,为什么会说它们已经连接? Spring 出于性能原因使用并发侦听器,以便可以一次使用多个消息。通过设置concurrency="1",您是在告诉 Spring not 创建多个侦听器。你真的试过这个吗?如果有,结果如何?
    • 刚刚尝试过,我仍然遇到同样的错误。我将更新我的问题以迭代我到底想要做什么。 @贾斯汀伯特伦
    • 我已经用@Justin Bertram 的步骤更新了我的问题
    • 不幸的是,该更新没有提供有关问题可能是什么的更多详细信息。你能创建一个minimal, reproducible example 来演示这个问题吗?通常,此练习本身会发现潜在问题,如果没有,则允许其他人重现问题并自行调查,而不必继续向您询问更多详细信息或提供可能的解决方案来尝试。
    猜你喜欢
    • 1970-01-01
    • 2013-06-27
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 2016-05-24
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多