爲什麼有這篇文章呢?因爲公司想在直播中的房間定時推送消息,因此想到用MQ的延時隊列,定時推送消息.嗯,先用單機版進行試驗
上篇文章搭建了MQ並啓動對延時任務支持
搭建地址
搭建生產者
假如我們用的是騰訊雲的直播,那麼已經引入相關jar包(自己去找)
pom.xml
<!-- activemq -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-spring</artifactId>
<version>${activemq-pool.version}</version>
</dependency>
<!-- spring-jms -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
- 引入對MQ支持
假設,沒有發生宕機情況,用的是Activemq的點對點模式
那麼對xml進行修改(沒錯,還是ssm那套,spring mvc)
- 創建連接工廠
<!-- CachingConnectionFactory 連接工廠 (有緩存功能)-->
<bean id="cachingConnectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- Session緩存數量 -->
<property name="sessionCacheSize" value="20" />
<property name="targetConnectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- MQ地址 賬戶名 密碼-->
<property name="brokerURL" value="tcp://192.168.1.195:61616?wireFormat.maxInactivityDuration=0" />
<property name="userName" value="admin" />
<property name="password" value="admin" />
<!-- 是否異步發送 -->
<property name="useAsyncSend" value="true"/>
<property name="trustAllPackages" value="true"/>
</bean>
</property>
</bean>
- 創建隊列
<!-- 定義消息隊列名稱(Queue) -->
<bean id="liveQueueDestination" class="org.apache.activemq.command.ActiveMQQueue">
<!-- 設置消息隊列的名字 -->
<constructor-arg>
<value>liveMQQueue</value>
</constructor-arg>
</bean>
- 配置JMS模板
<!-- 配置JMS模板(Queue),Spring提供的JMS工具類,它發送、接收消息。 -->
<bean id="liveJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory" />
<property name="defaultDestination" ref="liveQueueDestination" />
<property name="receiveTimeout" value="10000" />
<!-- true是topic,false是queue,默認是false,此處顯示寫出false -->
<property name="pubSubDomain" value="false" />
</bean>
- 創建生產者代碼
@Component
public class LiveJmsProducer {
@Resource(name = "liveJmsTemplate")
private JmsTemplate liveJmsTemplate;
/**
* 發送延時消息
* @param msg 消息體
* @param timel 延時時間 單位爲分鐘
*/
public void sendMessageAndTime(final String msg,Long timel) {
long delayTime = timel * 60000;
try {
liveJmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage(msg);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delayTime);
return message;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
延時時間單位爲分,好像很合理的樣子
創建消費者
- xml配置
<bean id="liveQueueReceiver"
class="com.backend.service.jms.JmsLiveConsumer"></bean>
<jms:listener-container destination-type="queue"
container-type="default" connection-factory="cachingConnectionFactory"
acknowledge="auto">
<jms:listener destination="liveMQQueue" ref="liveQueueReceiver" />
</jms:listener-container>
- 消費者代碼
@Component
public class JmsLiveConsumer implements MessageListener {
protected final Logger logger = Logger.getLogger(getClass());
@Autowired
private TencentIMService tencentIMService;
@Autowired
private LiveSystemMsgMapper liveSystemMsgMapper;
@Override
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
try {
LiveSystemMsgEntity liveSystemMsgEntity = JSONObject.parseObject(tm.getText(),LiveSystemMsgEntity.class);
String sendName = "系統管理員" ;
LiveSystemMsgEntity liveSystemMsgCheck = liveSystemMsgMapper.selectById(liveSystemMsgEntity.getId());
if (liveSystemMsgCheck == null) {
return;
}
if (liveSystemMsgCheck.getSendName()!=null&& liveSystemMsgCheck.getSendName() != "") {
sendName = liveSystemMsgCheck.getSendName();
}
//判斷消息是否能推送
if (liveSystemMsgCheck.getStatus()==3){
return;
}
//管理員名稱
Element elementElem = new Element();
elementElem.setText(liveSystemMsgEntity.getMsgContentText());
TIMMsgElement timMsgElementElem = new TIMMsgElement();
timMsgElementElem.setMsgContent(elementElem);
timMsgElementElem.setMsgType("TIMCustomElem");
//發送消息
Element elementText = new Element();
elementText.setText(liveSystemMsgEntity.getMsgContentText());
TIMMsgElement timMsgElementText = new TIMMsgElement();
timMsgElementText.setMsgContent(elementText);
timMsgElementText.setMsgType("TIMTextElem");
List<TIMMsgElement> list = new ArrayList<TIMMsgElement>();
list.add(timMsgElementElem);
list.add(timMsgElementText);
SendGroupMsgResponse sendGroupMsgResponse = tencentIMService.sendSystemGroupMsg(list,liveSystemMsgEntity.getGroupId());
if (!"OK".equals(sendGroupMsgResponse.getActionStatus())) {
logger.error("發送遠程消息失敗:"+sendGroupMsgResponse.toString());
}
} catch (JMSException e) {
logger.warn("接收延時消息失敗"+e);
}
}
}
關於TencentIMService 是不 會 給 你 們 的 ,你們自己去封裝一層騰訊雲im api
ok,啓動發送消息
登錄mq後臺
默認密碼賬號 admin
ok,成功,歐耶