ActiveMQ 注意用5.11版本,5.12与spring有冲突
ActiveMQTest:
测试类示例
package com.igeek.test.jedis;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import javax.jms.*;
import java.io.IOException;
public class ActiveMQTest {
/**
* PTP(点对点)
*/
//生产者
public void producer_queue() throws JMSException {
// 第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");//192.168.8.101:8161
// 第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接,调用 Connection 对象的 start 方法。
connection.start();
// 第四步:使用 Connection 对象创建一个 Session 对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
// 第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Queue对象。
Queue queue = session.createQueue("test_queue");//参数:给队列设置名称
// 第六步:使用 Session 对象创建一个 Producer 对象。
MessageProducer producer = session.createProducer(queue);
// 第七步:创建一个 Message 对象,创建一个 TextMessage 对象。
TextMessage message = new ActiveMQTextMessage();
message.setText("hello queue...message03");
// 第八步:使用 Producer 对象发送消息。
producer.send(message);
// 第九步:关闭资源。
session.close();
connection.close();
}
//消费者
public void consumer_queue() throws JMSException, IOException {
// 第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");
// 第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接,调用 Connection 对象的 start 方法。
connection.start();
// 第四步:使用 Connection 对象创建一个 Session 对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
// 第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Queue对象。
Queue queue = session.createQueue("test_queue");//参数:给队列设置名称
// 第六步:使用 Session 对象创建一个 Consumer 对象。
MessageConsumer cosumer = session.createConsumer(queue);
// 第七步:使用 Consumer 对象消费消息。
cosumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage _message = (TextMessage) message;
try {
System.out.println("消费者接收到消息..."+_message.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
// 第八步:关闭资源。
session.close();
connection.close();
}
/**
* Topic(发布/订阅)
*/
//生产者
public void producer_topic() throws JMSException {
// 第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");
// 第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接,调用 Connection 对象的 start 方法。
connection.start();
// 第四步:使用 Connection 对象创建一个 Session 对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
// 第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Topic对象。
Topic topic = session.createTopic("test-topic");//参数:给队列设置名称
// 第六步:使用 Session 对象创建一个 Producer 对象。
MessageProducer producer = session.createProducer(topic);
// 第七步:创建一个 Message 对象,创建一个 TextMessage 对象。
TextMessage message = new ActiveMQTextMessage();
message.setText("hello topic...message03");
// 第八步:使用 Producer 对象发送消息。
producer.send(message);
// 第九步:关闭资源。
session.close();
connection.close();
}
//消费者
public void consumer_topic() throws JMSException, IOException {
// 第一步:创建 ConnectionFactory 对象,需要指定服务端 ip 及端口号。
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://192.168.8.101:61616");
// 第二步:使用 ConnectionFactory 对象创建一个 Connection 对象。
Connection connection = connectionFactory.createConnection();
// 第三步:开启连接,调用 Connection 对象的 start 方法。
connection.start();
// 第四步:使用 Connection 对象创建一个 Session 对象。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);//参数:1.是否使用分布式事务(false 不使用) 2.activemq的响应类型(自动应答)
// 第五步:使用 Session 对象创建一个 Destination 对象(topic、queue),此处创建一个 Queue对象。
Topic topic = session.createTopic("test-topic");//参数:给队列设置名称
// 第六步:使用 Session 对象创建一个 Consumer 对象。
MessageConsumer cosumer = session.createConsumer(topic);
// 第七步:使用 Consumer 对象消费消息。
cosumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
TextMessage _message = (TextMessage) message;
try {
System.out.println("消费者接收到消息..."+_message.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read();
// 第八步:关闭资源。
session.close();
connection.close();
}
/**
* Spring与ActiveMQ整合测试
*/
//@Test
public void test_spring_activeMq(){
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
JmsTemplate jmsTemplate = ac.getBean(JmsTemplate.class);
Destination destination = (Destination) ac.getBean("topicDestination");
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = new ActiveMQTextMessage();
message.setText("hello...");
return message;
}
});//参数:1.目的地 2.消息创建器
}
}
发送消息:
applicationContext-activemq.xml
spring-queue
ItemServiceImpl 业务层应用
package com.igeek.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.igeek.mapper.TbItemMapper;
import com.igeek.pojo.TbItem;
import com.igeek.pojo.TbItemDesc;
import com.igeek.service.ItemDescService;
import com.igeek.service.ItemService;
import com.igeek.util.DataGridResult;
import org.apache.activemq.command.ActiveMQTextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.jms.*;
import java.util.Date;
import java.util.List;
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private TbItemMapper tbItemMapper;
@Autowired
private ItemDescService itemDescService;
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
@Qualifier("addItemDestination")
private Topic topic;
@Override
public List selectItems() {
return tbItemMapper.selectAll();
}
@Override
public DataGridResult selectItemsByPage(Long page, Long rows) {
DataGridResult result = new DataGridResult();
//设置页码 以及 每页条数
PageHelper.startPage(page.intValue(),rows.intValue());
//查询所有
List tbItems = tbItemMapper.selectAll();
//真正的查询操作
/*
查询对象:
pageInfo.getList() 每页的数据
pageInfo.getPages() 总页数
...
*/
PageInfo pageInfo = new PageInfo<>(tbItems);
//result.setRows(rows);
result.setTotal(pageInfo.getTotal());
result.setRows(pageInfo.getList());
return result;
}
//事务传播行为
@Override
public int addItem(TbItem item,String desc) {//开启事务
tbItemMapper.insert(item);
//封装商品描述对象
TbItemDesc itemDesc = new TbItemDesc();
itemDesc.setItemId(item.getId());
itemDesc.setItemDesc(desc);
itemDesc.setCreated(new Date());
itemDesc.setUpdated(itemDesc.getCreated());
//int i = 10/0;
//保存描述对象
itemDescService.addItemDesc(itemDesc);
//发送消息
jmsTemplate.send(topic, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = new ActiveMQTextMessage();
message.setText(item.getId()+"");//发送消息(消息内容:商品id)
return message;
}
});
return 1;
}
@Override
public void updateItem(TbItem item, String desc) {
//设置更新时间
item.setUpdated(new Date());
//设置不需要更新的字段值为null
item.setCreated(null);
item.setStatus(null);
tbItemMapper.updateByPrimaryKeySelective(item);//status->0 create->null Selective:选择性更新,如果为null不更新
TbItemDesc itemDesc = new TbItemDesc();
itemDesc.setItemId(item.getId());
itemDesc.setItemDesc(desc);
itemDescService.updateItemDesc(itemDesc);
}
@Override
public TbItem selectItemById(Long id) {
//加缓存 ITEM_CACHE->(id+"INFO"=内容)
return tbItemMapper.selectByPrimaryKey(id);
}
}
接收消息:
创建监听器:
package com.igeek.search.listener;
import com.igeek.search.service.SearchItemService;
import org.apache.solr.client.solrj.SolrServerException;
import org.springframework.beans.factory.annotation.Autowired;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import java.io.IOException;
/**
* ActiveMQ消息监听器(商品添加)
*/
public class ItemAddMessageListener implements MessageListener {
@Autowired
private SearchItemService searchItemService;
@Override
public void onMessage(Message message) {
TextMessage _message = (TextMessage)message;
try {
String text = _message.getText();//商品ID
//根据商品ID获取商品信息 同步索引库
Thread.sleep(200);//确保数据保存到数据库
searchItemService.addItem(Long.parseLong(text));
} catch (JMSException e) {
e.printStackTrace();
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
配置监听器:
applicationContext-activemq.xml