为了提供一个REST API接口,使算法测试能够通过这个接口发送消息到RocketMQ,我们可以在Spring Boot应用中创建一个新的Controller。这个Controller将调用RocketMQService的sendMessage方法来发送消息。下面是详细的设计和实现步骤。
步骤 1: 创建RocketMQMessage的数据传输对象(DTO)
首先,我们需要定义一个简单的DTO来接收从API调用中传入的消息数据。这个DTO将映射到RocketMQService.sendMessage方法需要的RocketMQMessage对象。
package com.aliyun.openservices.dto;
public class RocketMQMessageDTO {
private String topicName;
private String tag;
private String key;
private String body;
private String messageGroup;
// 省略Getter和Setter方法...
}
步骤 2: 创建消息发送的Controller
接着,创建一个Controller类,提供一个POST类型的API接口,供外部调用以发送消息。
package com.aliyun.openservices.controller;
import com.aliyun.openservices.RocketMQService;
import com.aliyun.openservices.dto.RocketMQMessageDTO;
import org.apache.rocketmq.client.apis.producer.SendReceipt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/message")
public class MessageController {
@Autowired
private RocketMQService rocketMQService;
@PostMapping("/send")
public ResponseEntity<?> sendMessage(@RequestBody RocketMQMessageDTO messageDTO) {
try {
// 转换DTO到服务层需要的消息对象
RocketMQMessage message = new RocketMQMessage();
message.setTopicName(messageDTO.getTopicName());
message.setTag(messageDTO.getTag());
message.setKey(messageDTO.getKey());
message.setBody(messageDTO.getBody());
message.setMessageGroup(messageDTO.getMessageGroup());
SendReceipt sendReceipt = rocketMQService.sendMessage(message);
return ResponseEntity.ok().body("Message sent successfully. MsgId: " + sendReceipt.getMessageId());
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.badRequest().body("Failed to send message: " + e.getMessage());
}
}
}
注意:这个实现假设RocketMQMessage类存在并已经正确定义,如果还没有定义,你需要根据RocketMQService.sendMessage方法的需求来创建它。
步骤 4: 写service
package com.aliyun.openservices;
import org.apache.rocketmq.client.apis.ClientConfiguration;
import org.apache.rocketmq.client.apis.ClientConfigurationBuilder;
import org.apache.rocketmq.client.apis.ClientException;
import org.apache.rocketmq.client.apis.ClientServiceProvider;
import org.apache.rocketmq.client.apis.producer.Producer;
import org.apache.rocketmq.client.apis.producer.SendReceipt;
import org.apache.rocketmq.client.apis.message.MessageBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.nio.charset.StandardCharsets;
@Service
public class RocketMQService {
@Value("${rocketmq.endpoint}")
private String endpoint;
@Value("${rocketmq.username}")
private String username;
@Value("${rocketmq.password}")
private String password;
public SendReceipt sendMessage(RocketMQMessage message) throws ClientException {
ClientServiceProvider provider = ClientServiceProvider.loadService();
ClientConfigurationBuilder configBuilder = ClientConfiguration.newBuilder().setEndpoints(endpoint);
if (username != null && password != null) {
configBuilder.setCredentialProvider(
new StaticSessionCredentialsProvider(username, password)
);
}
ClientConfiguration configuration = configBuilder.build();
Producer producer = provider.newProducerBuilder()
.setClientConfiguration(configuration)
.setTopics(message.getTopicName())
.build();
MessageBuilder builder = provider.newMessageBuilder()
.setTopic(message.getTopicName())
.setBody(message.getBody().getBytes(StandardCharsets.UTF_8));
if (message.getKey() != null && !message.getKey().isEmpty()) {
builder.setKeys(message.getKey());
}
if (message.getTag() != null && !message.getTag().isEmpty()) {
builder.setTag(message.getTag());
}
if (message.getMessageGroup() != null && !message.getMessageGroup().isEmpty()) {
builder.setMessageGroup(message.getMessageGroup());
}
SendReceipt sendReceipt = producer.send(builder.build());
System.out.println("Send mq message success! Topic is:" + message.getTopicName() + " msgId is: " + sendReceipt.getMessageId().toString());
producer.close();
return sendReceipt;
}
}
步骤 3: 更新application.properties
确保你的application.properties文件中包含了RocketMQ的连接信息。
rocketmq.endpoint=yourEndpoint
rocketmq.username=yourUsername
rocketmq.password=yourPassword
步骤 4: 测试
启动Spring Boot应用,并使用Postman或任何HTTP客户端工具向/api/message/send发送POST请求,请求体包含要发送的消息信息。
{
"topicName": "exampleTopic",
"tag": "exampleTag",
"key": "messageKey",
"body": "Hello RocketMQ",
"messageGroup": "exampleGroup"
}
成功调用后,你的RocketMQ服务应该能接收到这条消息。
总结
这个设计提供了一个通过REST API发送消息到RocketMQ的简单方法,利用了Spring Boot的依赖注入和自动配置特性,同时保持了代码的清晰和可维护性。通过这种方式,算法测试人员或其他用户可以很容易地通过HTTP请求发送消息进行测试。
2335

被折叠的 条评论
为什么被折叠?



