配置环境
版本信息:
Spring 4.2.8.RELEASE(其中囊括tx、webmvc、context、aop之类的)
Spring-data-jpa 1.10.5.RELEASE
Spring-data-redis 1.8.0.RELEASE
Spring-data-commons 1.12.5.RELEASE
MySQL 5.7
JDK 1.8
Maven依赖:
<!-- spring begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.2.8.RELEASE</version>
</dependency><dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.10.5.RELEASE</version>
</dependency>
<!-- spring end -->
<!-- redis start-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.0.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!--redis end-->
ApplicationContext.xml 配置
这里就只添加 Redis 相关的信息了。
<!-- 事务管理器 -->
<bean id="MytransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="MyentityManagerFactory" />
<property name="dataSource" ref="MydataSource"/>
</bean>
<!-- 注解式事务 -->
<tx:annotation-driven transaction-manager="MytransactionManager" />
<!--MessageQueue Start-->
<bean id="MQConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:hostName="127.0.0.1" p:port="6379" p:password="password" p:usePool="true">
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
p:connectionFactory-ref="MQConnectionFactory"/>
<!--JDK序列化工具-->
<bean id="Serialization" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
<!--文本序列化工具-->
<bean id="Stringserialization" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
<!--订阅者-->
<bean id="Listener" class="com.MuNineyi.messagequeue.Listener"/>
<!--订阅者适配器-->
<bean id="MessageListenerAdapter" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
<property name="serializer" ref="Serialization" />
<property name="stringSerializer" ref="Stringserialization"/>
<property name="delegate" ref="Listener" /> <!--订阅者/目的地-->
<property name="defaultListenerMethod" value="receiveMessage"/> <!--默认接收方法-->
</bean>
<!--channelPattern 通道设置器,这里和老版本是不同的-->
<bean id="Topic" class="org.springframework.data.redis.listener.PatternTopic" beans:pattern="identity"/>
<!--装箱,这里和老版本是不同的-->
<bean id="RedisMessageListenerContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
<property name="connectionFactory" ref="MQConnectionFactory"/>
<property name="topicSerializer" ref="Stringserialization"/> <!--通道序列化-->
<property name="messageListeners">
<map key-type="org.springframework.data.redis.connection.MessageListener" value-type="org.springframework.data.redis.listener.PatternTopic">
<entry key-ref="MessageListenerAdapter" value-ref="Topic"/>
</map>
</property>
</bean>
<!--MessageQueue End-->
代码实现
消息传递类(消息实体)
public class Message{
private String name;
private String age;
private String liveCity;
//相关的 get、set 方法
}
Sender 发送者
这里可以写成接口的形式,方便调用
@Service("Service")
public class Sender{
@Qualifier(value = "redisTemplate")
private RedisTemplate redisTemplate;
public void sendMessage(String channel, Serializable message) {
redisTemplate.convertAndSend(channel, message);
}
public RedisTemplate getRedisTemplate() {
return redisTemplate;
}
public void setRedisTemplate(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void getInformationFromOtherAPI(String name, String age, String liveCity) throws InterruptedException {
Message message = new Message();
message.setName(name);
message.setAge(age);
message.setLiveCity(liveCity);
sendMessage("identity ", message);
}
}
Listener 订阅者
@Service("Listener")
public class Listener{
@Autowired
private MiddleService middleService;
/**
* 订阅者
* @param message
*/
public void receiveMessage(Serializable message) {
if (message instanceof Message){
Message message = (Message) message;
System.out.println(message.getName()+message.getAge()+message.getLiveCity());
}
}
}
简单的代码实现已经完成了
调用 getInformationFromOtherAPI(), 就可以实现将信息填入消息队列中。