花里胡哨地使用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,成功,欧耶

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