activeMQ整合Spring的使用
- 完成添加数据到数据库实现自动导入索引库的功能
- 实现的思路:
- 在service层添加商品提交数据之前,将消息发送出去,使用topic模式
- 在另一个独立工程的service中,接收消息,执行添加到索引库中
MQ整合Spring ,发送消息
- 第一步:引用相关的jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
- 配置Activemq整合spring,配置ConnectionFactory
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.25.168:61616" />
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory" />
</bean>
- 配置生产者,使用JMSTemplate对象,发送消息。
<!-- 配置生产者 -->
<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory" />
</bean>
- 在spring容器中配置Destination
<!--这个是队列目的地,点对点的 -->
<bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg>
<value>spring-queue</value>
</constructor-arg>
</bean>
<!--这个是主题目的地,一对多的 -->
<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="topic" />
</bean>
MQ整合Spring ,接收消息
- 把Activemq相关的jar包添加到工程中
- 创建一个MessageListener的实现类(以MyMessageListener为例)
public class MyMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
TextMessage textMessage = (TextMessage) message;
//取消息内容
String text = textMessage.getText();
System.out.println(text);
} catch (JMSException e) {
e.printStackTrace();
}
}
}
- 配置spring和Activemq整合
<!-- 接收消息 -->
<!-- 配置监听器 -->
<bean id="myMessageListener" class="cn.e3mall.search.listener.MyMessageListener" />
<!-- 消息监听容器 -->
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="queueDestination" />
<property name="messageListener" ref="myMessageListener" />
</bean>
这里面配置的destination是点对点方式,可以自己调整。
- 测试代码
@Test
public void testQueueConsumer() throws Exception {
//初始化spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
//等待
System.in.read();
}
实现商品的详细展示
- 问题:添加商品信息是上传了多张图片,要求取一张图片放到页面中,而图片服务器中存储的格式文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。而逆向工程生成的pojo类无法使用,不改变源代码的情况。
- 解决的思路,创建一个pojo作为商品表TbItem的子类,定义一个图片数组方法,再定义一个构造方法,将TbItem对象当做参数传进来。原因,页面需要的数据是Item,而查询数据库表是TbItem,进行转换即可。