写一个测试接口,发送阿里云RocketMq

为了提供一个REST API接口,使算法测试能够通过这个接口发送消息到RocketMQ,我们可以在Spring Boot应用中创建一个新的Controller。这个Controller将调用RocketMQServicesendMessage方法来发送消息。下面是详细的设计和实现步骤。

步骤 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请求发送消息进行测试。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MonkeyKing.sun

对你有帮助的话,可以打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值