花裏胡哨地使用MQ定時推送消息到直播房間

爲什麼有這篇文章呢?因爲公司想在直播中的房間定時推送消息,因此想到用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,成功,歐耶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章