我是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监听器容器,但错误仍然是说特定的客户端已经连接。
我正在尝试做的步骤-------------------------。
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。.
我怎么能解决这个问题?如果有人可以帮助。先谢谢你。
我相信问题是,每个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>