06.SpringはRabbitMQを統合します
- 企業で最も広く使用されている5つのメッセージモデルは最後のモデルです:方向マッチングトピック
- Spring AMQPは、Springフレームワークに基づくAMQPメッセージソリューションであり、メッセージを送受信するためのテンプレート化された抽象化レイヤーを提供し、メッセージ駆動型POJOに基づくメッセージ監視を提供します。これにより、RabbitMQ関連プログラムの開発が簡素化されます。
1.プロデューサーエンジニアリング
1.1依存関係の紹介
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wh</groupId>
<artifactId>spring-rabbitmq-producer</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</project>
1.2 placespring-rabbitmq-producer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">
<!--1.配置连接-->
<rabbit:connection-factory id="connectionFactory" host="192.168.77.182" port="5672" username="root" password="root" virtual-host="/weihong"/>
<!--2.配置队列-->
<rabbit:queue name="test_spring_queue_1"/>
<!--3.配置rabbitAdmin:主要用于在java代码中对队列的管理,用来创建,绑定,删除队列与交换机。发送消息-->
<rabbit:admin connection-factory="connectionFactory" />
<!--4.配置交换机,topic类型-->
<rabbit:topic-exchange name="spring_topic_exchange">
<rabbit:bindings>
<!--绑定队列-->
<rabbit:binding pattern="msg.#" queue="test_spring_queue_1"></rabbit:binding>
</rabbit:bindings>
</rabbit:topic-exchange>
<!--5.配置json转换的工具-->
<bean id="jsonMessageConverter" class="org.springframework.amqp.support.converter.Jackson2JsonMessageConverter"/>
<!--6.配置rabbit的模板-->
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory" exchange="spring_topic_exchange" message-converter="jsonMessageConverter" />
</beans>
1.3メッセージ送信のテスト
package test;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.HashMap;
import java.util.Map;
/**
* @author WeiHong
* @date 2021 - 09 - 14 20:12
*/
public class Sender {
public static void main(String[] args){
//1.创建spring容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-rabbitmq-producer.xml");
//2.从容器中获得rabbit模板对象
RabbitTemplate rabbitTemplate = context.getBean(RabbitTemplate.class);
//3.发消息
Map<String,String> map = new HashMap<String,String>();
map.put("name","魏红");
map.put("email","[email protected]");
rabbitTemplate.convertAndSend("msg.user",map);
context.close();
}
}
2.消費者工学
2.1依存関係はプロデューサーと一致しています
2.2spring-rabbitmq-consumer.xmlコード
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:rabbit="http://www.springframework.org/schema/rabbit"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/rabbit
http://www.springframework.org/schema/rabbit/spring-rabbit.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--1.配置连接-->
<rabbit:connection-factory id="connectionFactory" host="192.168.77.182" port="5672" username="root" password="root" virtual-host="/weihong"/>
<!--2.配置队列-->
<rabbit:queue name="test_spring_queue_1"/>
<!--3.配置rabbitAdmin:主要用于在java代码中对队列的管理,用来创建,绑定,删除队列与交换机。发送消息-->
<rabbit:admin connection-factory="connectionFactory" />
<!--4.注解扫描包(SpringIoc)-->
<context:component-scan base-package="listener"/>
<!--5配置监听-->
<rabbit:listener-container connection-factory="connectionFactory">
<rabbit:listener ref="consumerListener" queue-names="test_spring_queue_1"/>
</rabbit:listener-container>
</beans>
2.2消費者
-
MessageListenerインターフェースは、Springコンテナーがメッセージを受信した後にメッセージを処理するために使用されます
-
メッセージを処理するために独自のタイプを使用する必要がある場合は、このインターフェースを実装し、onMessage()メソッドをオーバーライドする必要があります
-
スプリングコンテナがメッセージを受信すると、処理のためにonMessageに自動的に渡されます
package listener;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* @author WeiHong
* @date 2021 - 09 - 14 20:46
*
*/
@Component
public class ConsumerListener implements MessageListener {
//jasckson提供序列化和反序列化中使用哦最多的类,用来转换json的
public static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public void onMessage(Message message) {
//将message对象转换成json
try {
JsonNode jsonNode = MAPPER.readTree(message.getBody());
String name = jsonNode.get("name").asText();
String email = jsonNode.get("email").asText();
System.out.println("从队列中获取:【"+name+"的邮箱是:"+email+"】");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3プロジェクトを開始する
package listener;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* @author WeiHong
* @date 2021 - 09 - 14 21:05
* 运行项目
*/
public class test {
public static void main(String[] args) throws IOException {
//获取容器
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/spring-rabbitmq-consumer.xml");
//让程序一直跑起来,不终止
System.in.read();
}
}