SpringBoot集成RocketMQ
1.Rocket依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
2.application.yml配置说明:
rocketmq:
name-server: 192.168.0.85:9876
producer:
group: myGroup
3.引入RocketMQTemplate
@Resource
private RocketMQTemplate rocketMQTemplate;
4.编写生产者测试类
package com.testMQ.rocketmq;
import com.testMQ.rocketmq.constant.TopicConstant;
import com.testMQ.rocketmq.domain.User;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.TopicConfig;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.MimeTypeUtils;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerSendMsgExample {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Test
public void sendSync(){
rocketMQTemplate.syncSend(TopicConstant.SYNC_TOPIC,"test-hello-word");
rocketMQTemplate.convertAndSend(TopicConstant.SYNC_TOPIC,"test-hello-word");
User user = new User();
user.setName("张三");
user.setAge(23);
rocketMQTemplate.syncSend(TopicConstant.SYNC_TOPIC,user);
rocketMQTemplate.syncSend(TopicConstant.SYNC_TOPIC, MessageBuilder.withPayload(user).build());
}
@Test
public void sendAsync(){
rocketMQTemplate.asyncSend(TopicConstant.ASYNC_TOPIC, "这是异步发送", new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("异步发送成功之后的回调:"+sendResult.toString());
}
@Override
public void onException(Throwable throwable) {
throwable.printStackTrace();
}
});
}
@Test
public void sendOneway(){
rocketMQTemplate.sendOneWay(TopicConstant.ASYNC_TOPIC, "这是单项发送");
}
@Test
public void syncSendOrderly(){
rocketMQTemplate.syncSendOrderly(TopicConstant.ORDERLY_TOPIC, "这是有序发送","hashkey");
}
}
5.发送事务消息
5.1事务消息发送流程
5.2事务消息配置
package com.testMQ.rocketmq;
import org.apache.commons.lang3.StringUtils;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.apache.rocketmq.spring.support.RocketMQUtil;
import org.springframework.messaging.Message;
import org.springframework.messaging.converter.StringMessageConverter;
@RocketMQTransactionListener(rocketMQTemplateBeanName="rocketMQTemplate")
public class RocketMqTransactionConfig implements RocketMQLocalTransactionListener {
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
String destination = arg.toString();
org.apache.rocketmq.common.message.Message message = RocketMQUtil.convertToRocketMessage(new StringMessageConverter(), "utf-8", destination, msg);
String tags = message.getTags();
if(StringUtils.contains(tags,"TagA")){
return RocketMQLocalTransactionState.COMMIT;
}else if(StringUtils.contains(tags,"TagB")){
return RocketMQLocalTransactionState.ROLLBACK;
}else {
return RocketMQLocalTransactionState.UNKNOWN;
}
}
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
return null;
}
}
5.3 生产者发送消息
package com.testMQ.rocketmq;
import com.testMQ.rocketmq.constant.TopicConstant;
import com.testMQ.rocketmq.domain.User;
import org.apache.commons.validator.Msg;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.TransactionSendResult;
import org.apache.rocketmq.common.TopicConfig;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.MimeTypeUtils;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProducerSendMsgExample {
@Resource
private RocketMQTemplate rocketMQTemplate;
@Test
public void syncSendTransactionMsg() throws InterruptedException {
String[] tags = new String[]{"TagA","TagB","TagC","TagD","TagE"};
String msg = "这是事务消息";
for (int i = 0; i < 10; i++) {
Message message = MessageBuilder.withPayload(msg+"-"+i).build();
String destination = TopicConstant.TRANSACTION_TOPIC+":"+tags[i % tags.length];
TransactionSendResult sendResult = rocketMQTemplate.sendMessageInTransaction(destination, message, destination);
System.out.println("sendResult = " + sendResult);
Thread.sleep(10);
}
}
}