为什么有这篇文章呢?因为公司想在直播中的房间定时推送消息,因此想到用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,成功,欧耶