原因是 经纪人:localhost - 客户端:tata_consumer已经从tcp:/127.0.0.1:52917连接。

问题描述 投票:0回答:1

我是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)基本上将收到的消息的JSON字符串返回给UI。
  4. 我没有在本地使用任何Web服务器,而是使用Tomcat7插件来运行我的Spring项目。mvn tomcat7:run. 我启动了一个本地AMQ服务器 activemq start 并开始我的UI代码,使用 npm start

下面是我的ReactJs UI代码片段,它可以进行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);
      });
 }

我已经把我的Spring应用代码分享到 https:/github.comhetalrachhstock-market-ticker。.

我怎么能解决这个问题?如果有人可以帮助。先谢谢你。

java activemq spring-jms jms-topic
1个回答
0
投票

我相信问题是,每个Spring listener-container 正在创造 多重 听筒,而这些多个听筒中的每一个都在使用相同的 client-id 值的父容器。这是JMS规范所不允许的。请尝试使用 concurrency="1" 在你 listener-container 元素,例如:

    <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>

© www.soinside.com 2019 - 2024. All rights reserved.