虽然大部分情况使用mq是要实现一些异步的效果,但是有的时候有的需求缺需要使用mq来实现同步的效果,项目中使用的是rabbitMq,这里说下怎么用rabbitMq实现同步的效果。
第一步:引入jar包
<dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit</artifactId> <version>1.6.5.RELEASE</version> </dependency>
第二步:客户端的配置配置
<rabbit:connection-factory id="connectionFactory"
username="${rabbit.service.conn.user}"
password="${rabbit.service.conn.password}"
host="${rabbit.service.conn.host}"
port="${rabbit.service.conn.port}" />
<!-- reply-queue:服务端响应发送到的队列 reply-address:replyEx/routeReply -->
<rabbit:template id="amqpTemplate" connection-factory="connectionFactory" reply-queue="replyQueue"
reply-address="${rabbit.queue.orderSettleReply}/${rabbit.rountKey.orderSettleReply}"
correlation-key="correlationIdString" reply-timeout="10000">
<rabbit:reply-listener/>
</rabbit:template>
<rabbit:queue id="replyQueue" name="${rabbit.queue.orderSettleReply}" durable="true" auto-delete="false" exclusive="false">
</rabbit:queue>
第三步:代码编写(部分客户端代码)
MessageProperties messageProperties = new MessageProperties();
messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT);
messageProperties.setExpiration(String.valueOf(30 * 1000));
// correlationIdString 是自动生成的,所以客户端代码不需要做处理,服务端代码需要拿请求后,取出correlationIdString,然后通过messageProperties.setHeader("correlationIdString", correlationIdString);传回给客户端
// String correlationIdString = "";
// messageProperties.setHeader("correlationIdString", correlationIdString);
String json = new Gson().toJson(params);
Message message = new Message(json.getBytes(), messageProperties);
Message resMessage = amqpTemplate.sendAndReceive(exchange, routingKey, message);
return isSuccess(resMessage);
通过这样的设置以及代码,客户端就能通过设置好的队列去取响应,根据设置好的correlation-key的值去关联请求响应,将相应同步反馈给对应的客户端