2.
ActiveMQ工作原理(JSM java message server)- 解決服務之間的耦合
- 使用消息隊列,增加系統併發處理量
3.ActiveMQ 應用場景分析
1、 用戶註冊,重點用戶信息數據庫保存,發短信、發郵件,增加業務處理複雜度,這時候使用 MQ, 將發短信、發郵箱,通知 MQ,由另外服務平臺完成
2、 搜索平臺、緩存平臺
- 查詢數據,建立緩存、索引 ,不從數據庫查詢,從緩存或者索引庫查詢
- 當增加、修改、刪除數據時,發送消息給 MQ, 緩存平臺、索引平臺 從 MQ 獲取到這個信息,更新緩存或者索引
ActiveMQ的使用
ActiveMQ 使用的是標準生產者和消費者模型
- 有兩種數據結構 Queue、Topic
- 1、 Queue 隊列 ,生產者生產了一個消息,只能由一個消費者進行消費
- 2、 Topic 話題,生產者生產了一個消息,可以由多個消費者進行消費
使用Java程序操作ActiveMQ
- 第一步:導入activeMQ的座標
- 第二步:(一般不用自己寫)編寫MQ消息生產者
@Test
public void testProducerMQ() throws Exception {
// 連接工程-依賴jms java中的消息接口(默認的用戶名密碼,路徑)
// 路徑寫法是 tcp://host:port
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
// 獲取一個鏈接
Connection connection = connectionFactory.createConnection();
// 建立會話
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
//其中第一個參數是(是否開啓事務,開啓後只有在commit的時候才發),
第二個參數代表自動簽收,(當commit的時候就簽收)
// 創建隊列,話題對象
Queue queue = session.createQueue("HelloWorld");
// 創建消息生產者or 消費者
MessageProducer producer = session.createProducer(queue);
// 發送消息
for (int i = 0; i < 10; i++) {
producer.send(session.createTextMessage("你好,activeMQ"));
}
// 提交消息
session.commit();
}
默認 tcp 連接 activeMQ 端口 61616 !!!
@Test
public void testConsume() throws Exception{
// 連接工程-依賴jms java中的消息接口(默認的用戶名密碼,路徑)
// 路徑寫法是 tcp://host:port
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
// 獲取一個鏈接
Connection connection = connectionFactory.createConnection();
//開啓鏈接\
connection.start();
// 建立會話
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 創建隊列,話題對象
Queue queue = session.createQueue("HelloWorld");
// 創建消息生產者or 消費者
MessageConsumer consumer = session.createConsumer(queue);
//利用監聽器接收消息
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage message2 = (TextMessage) message;
try {
System.out.println(message2.getText());
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
Spring 結合 ActiveMQ編程
1 在activeMQ_spring導入相關jar包
下圖爲activemq依賴包
下圖爲spring 結合activemq的依賴包
2 如果是消息生廠商,則需要配置application-mq.xml
另外配置需要的生產者
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;
調用生產者的方法
//調用mq服務,發送一條消息
jmsTemplate.send("bos_sms",new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
MapMessage mapMessage = session.createMapMessage();
mapMessage.setString("telephone", order.getCourier().getTelephone());
mapMessage.setString("msg", msg);
return mapMessage;
}
});
3,消費者,直接搭建一個服務器工程
創建消費者的類
@Service
public class SmsConsumer implements MessageListener{
@Override
public void onMessage(Message message) {
//調用smsutils來發送短信
// String result = SmsUtils.sendSmsByHTTP(model.getTelephone(), msg);
MapMessage mapMessage = (MapMessage) message;
try {
String telephone = mapMessage.getString("telephone");
String msg = mapMessage.getString("msg");
System.out.println("發送短信內容:"+msg+"接收手機號:"+telephone);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String result = "000123";
if (result.startsWith("000")) {
//發送成功
System.out.println("發送成功");
} else {
throw new RuntimeException("短信發送失敗,信息碼:" + result);
}
}
}