rocketmq使用-broker监听端口,多个生产者消费者问题

1.broker监听端口问题

安装云端rocketmq在使用java链接的时候回出现一个端口链接问题,报错如下:

“org.apache.rocketmq.remoting.exception.RemotingConnectException: connection to ip : 10911 failed”

后来设置了broker启动的时候参数

nohup sh mqbroker -n 49.235.21.109:9876 autoCreateTopicEnable=true -c /usr/local/rocketmq-rocketmq-all-4.2.0/distribution/target/apache-rocketmq/conf/broker.properties >/usr/local/logs/rocketmqlogs/broker.log 2>&1 &

创建一个文件broker.properties,里面编写

brokerIP1=49.235.21.109
listenPort=10919

指定外网地址及监听端口,后来发现启动后自动占用了三个端口,分别是10917,10919,10920。java连接的时候固定使用的10917,目前还没有找到为什么会监听端口-2的端口去连接。

2.多个生产多个消费者问题

一个rocketMQ的group组下面不能有多个生产者同时注册及多个消费者同时注册,想要实现多个生产者跟消费者,要设置多个组,一个组对应的只有一个生产消费。
例子:

DefaultMQProducer defaultMQProducer1 = new DefaultMQProducer("hmops");

defaultMQProducer1注册到了hmops组,这个时候再注册一个生产者进去

DefaultMQProducer defaultMQProducer2 = new DefaultMQProducer("hmops");

此时就会报错
java.lang.RuntimeException: org.apache.rocketmq.client.exception.MQClientException: The producer group[hmops] has been created before, specify another name please.

消费者也一样的例子

DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer("hmops");
DefaultMQPushConsumer consumer2 = new DefaultMQPushConsumer("hmops");

Error creating bean with name 'consumer2' defined in class path resource [com/hmop/tpd/configuration/RocketMQConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.rocketmq.client.consumer.DefaultMQPushConsumer]: Factory method 'getRocketMQConsumer' threw exception; nested exception is java.lang.RuntimeException: org.apache.rocketmq.client.exception.MQClientException: The consumer group[hmops] has been created before, specify another name please.
最后得到结论,一个组只能有一个生产者及消费者进行注册,组里面的消费者可以订阅组下面的多个topic主题及tag标签。

consumer.subscribe("topic1", "tag1");
consumer.subscribe("topic2", "tag2");

业务区分在监听消费类中进行代码区分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RocketMQ 5.1.0版本中,除了使用监听器类来处理消息外,还可以使用注解来标注消息处理方法。具体步骤如下: 1. 添加`@RocketMQMessageListener`注解到消费者类上,指定`consumerGroup`、`topic`和`messageModel`等属性。 2. 在消息处理方法上添加`@RocketMQMessageListener`注解,指定`consumerGroup`、`topic`、`messageModel`和`selectorExpression`等属性。 3. 在消息处理方法的参数中添加`List<MessageExt>`类型的参数,用于接收从broker拉取回来的消息。 下面是一个使用注解的示例: ```java import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueAveragely; import org.apache.rocketmq.client.consumer.rebalance.AllocateMessageQueueByConfig; import org.apache.rocketmq.common.message.MessageExt; import org.springframework.stereotype.Service; import java.util.List; import com.alibaba.rocketmq.annotation.ConsumeMode; import com.alibaba.rocketmq.annotation.MessageModel; import com.alibaba.rocketmq.annotation.RocketMQMessageListener; import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere; @Service @RocketMQMessageListener(consumerGroup = "test-group", topic = "test-topic", selectorExpression = "test-tag", messageModel = MessageModel.CLUSTERING, consumeMode = ConsumeMode.CONCURRENTLY, consumeThreadMax = 64, consumeThreadMin = 20, messageQueueListener = AllocateMessageQueueAveragely.class, consumeFromWhere = ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET) public class MyMessageListener implements MessageListenerConcurrently { @Override @RocketMQMessageListener(consumerGroup = "test-group", topic = "test-topic", selectorExpression = "test-tag", messageModel = MessageModel.CLUSTERING, consumeMode = ConsumeMode.CONCURRENTLY) public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { for (MessageExt msg : msgs) { System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msg); } return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } } ``` 在这个示例中,我们使用了`@RocketMQMessageListener`注解来标注消费者类和消息处理方法。我们指定了消费者组、主题、标签、消息模式、消费模式、消费线程数量、队列分配策略、消费起始位置等属性。在消息处理方法中,我们使用了`ConsumeConcurrentlyContext`参数和`List<MessageExt>`参数来接收消息,并打印了收到的消息。最后,我们返回了`ConsumeConcurrentlyStatus.CONSUME_SUCCESS`实例,表示这个消息已经被成功消费。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值