rabbitTemplate.convertAndSend 添加编码格式
时间: 2024-05-17 12:14:11 浏览: 68
您可以使用`rabbitTemplate.convertAndSend`方法的重载版本来指定消息的编码格式。例如,如果您想使用UTF-8编码发送消息,可以按以下方式更改您的代码:
```java
String message = "Hello, RabbitMQ!";
byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
rabbitTemplate.convertAndSend("exchange", "routingKey", messageBytes, messagePostProcessor -> {
MessageProperties properties = messagePostProcessor.getMessageProperties();
properties.setContentEncoding("UTF-8");
return messagePostProcessor;
});
```
在上述示例中,我们通过将字符串消息转换为字节数组,并将编码设置为UTF-8来添加编码格式。然后,我们通过使用`convertAndSend`方法的重载版本来发送消息,并使用自定义的`MessagePostProcessor`来设置消息的属性,包括`content-encoding`属性以指定编码格式。
请注意,这只是一个示例,您需要根据您的具体需求进行适当的修改。
相关问题
### 题目二 **训练目标:** 能够熟练使用RabbitMQ各种工作模式 **需求场景:** ①在题目一中小泽已经通过MQ完成订单服务和商品服务的异步通信; ②现在项目经理又提出一个要求,要求在下完订单后,还要通过积分服务添加积分。将来可能还要给用户发送优惠券。 ③需求架构如下 ![image-20220127121450735](assets\image-20220127121450735.png) ④考虑到后续业务的加入肯定会修改订单服务的代码,现在要求使用MQ解决该问题; **作业要求:** 要求使用MQ相关的知识解决下单的web接口后续要修改代码的问题; 相关的环境已经准备完毕,要求补全订单服务的代码和商品服务及积分服务代码; **环境准备**: 1.将资料中提供的作业资料导入到idea中,其中orders是商品服务,goods是订单服务,scores是积分服务。在orders服务中已经完成了下单;在goods服务总共已经完成了扣减库存,在scores服务中已经完成了添加积分; 2.修改maven环境 3.修改项目编码为UTF-8 4.准备nacos注册中心 5.访问下单web接口,地址为http://localhost:8888/order/submit/1/1 **提示:** 1.可以考虑使用MQ的发布订阅模式来解决; 2.架构如下:对于生产者来说,只要发送消息到rabbitmq即可。消费者从各自的消息队列中获取消息完成相关的业务;
好的,我了解了你的需求和环境准备。下面我将根据你的要求,补全订单服务的代码和商品服务及积分服务代码,使用MQ解决下单的web接口后续要修改代码的问题。
首先,我们需要在订单服务中添加MQ相关的依赖,包括RabbitMQ和Spring Boot的AMQP支持,可以在pom.xml文件中添加以下代码:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.7.3</version>
</dependency>
```
然后,在application.properties文件中指定MQ的连接信息:
```properties
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
```
接下来,我们需要修改订单服务的代码,在下单方法中发送消息到MQ,代码如下:
```java
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public void submitOrder(Long userId, Long productId) {
// 扣减库存
String url = "http://localhost:8081/goods/reduceStock/" + productId;
Integer result = restTemplate.getForObject(url, Integer.class);
if (result != null && result > 0) {
// 添加积分
url = "http://localhost:8082/scores/addScore/" + userId;
restTemplate.getForObject(url, Void.class);
// 发送消息到MQ
Order order = new Order();
order.setUserId(userId);
order.setProductId(productId);
rabbitTemplate.convertAndSend("order_exchange", "order.create", order);
}
}
}
```
在这段代码中,我们使用了RabbitTemplate来发送消息到MQ,将订单对象转换成消息,并指定交换机和路由键。
接下来,我们需要在商品服务和积分服务中添加MQ的消费者代码,从MQ中获取订单消息,完成对应的业务处理。
商品服务的代码如下:
```java
@Component
public class OrderConsumer {
@Autowired
private GoodsService goodsService;
@RabbitListener(queues = "order_queue")
public void handleOrderCreate(Order order) {
// 扣减库存
goodsService.reduceStock(order.getProductId());
}
}
```
在这段代码中,我们使用@RabbitListener注解来指定从哪个队列中获取消息,并定义了一个handleOrderCreate方法来处理订单创建消息,调用GoodsService的reduceStock方法来扣减库存。
积分服务的代码如下:
```java
@Component
public class OrderConsumer {
@Autowired
private ScoreService scoreService;
@RabbitListener(queues = "order_queue")
public void handleOrderCreate(Order order) {
// 添加积分
scoreService.addScore(order.getUserId());
}
}
```
在这段代码中,我们也使用了@RabbitListener注解来指定从哪个队列中获取消息,并定义了一个handleOrderCreate方法来处理订单创建消息,调用ScoreService的addScore方法来添加积分。
最后,我们需要在MQ中创建交换机和队列,并绑定它们之间的关系,代码如下:
```java
@Configuration
public class MQConfig {
@Bean
public TopicExchange orderExchange() {
return new TopicExchange("order_exchange");
}
@Bean
public Queue orderQueue() {
return new Queue("order_queue");
}
@Bean
public Binding orderBinding() {
return BindingBuilder.bind(orderQueue()).to(orderExchange()).with("order.#");
}
}
```
在这段代码中,我们定义了一个TopicExchange和一个Queue,并使用BindingBuilder将它们绑定在一起,指定了路由键的模式。
好了,现在我们已经完成了使用MQ解决下单的web接口后续要修改代码的问题,可以测试一下,是否能够成功下单,并扣减库存、添加积分。
阅读全文