业务需求:
批量插入/更新HAP_DEMO表练习
以下为实现功能的要点:
1. 要求使用队列方式实现
2. 在Demo⻚面新增按钮,⽤于启动列息的发送
3. 一次性向队列中推送1000条消息,消息内容为 DEMO 记录的ID
4. 消息队列的名称: wht:<部⻔门简称:<⼯工号>:demo , 例如 wht:ora:2062:demo
5. 队列的消费者接收到DEMO的ID,随机更新ID对应的Name值,可参考之前的定时任务的逻辑。
6. 消费者在处理前使用 Thread.sleep ⽅法模拟处理时长为30s的任务;
-
ora20796_deml.html
先增加一个按钮:注意data-bind="click:startMessageQueue"
拼写
启动队列消息
url: '${base.contextPath}/ora/20796/hap/demo/send/mq',
这个要和控制类里面的路径对应
/**
*启动消息队列
*/
startMessageQueue:function(){
alert("启动消息队列")
///hap/demo/send/mq
$.ajax({
url: '${base.contextPath}/ora/20796/hap/demo/send/mq',
type: 'POST',
dataType: "json",
contentType: "application/json",
success: function (result) {
if(result.success){
kendo.ui.showInfoDialog({
title: $l('hap.tip.info'),
message: $l("hap.success")
});
viewModel.query();
} else {
kendo.ui.showErrorDialog({
title: $l('hap.error'),
message : result.message
});
}
}
});
},
image.png
接口IOra20796DemoService.java
:
/**
* 消息队列
*/
void sendMessageTest ();
实现类Ora20796DemoServiceImpl.java
:
/**
* 消息队列发送
* ⼀一次性向队列列中推送1000条消息,消息内容为 DEMO 记录的ID
*/
@Autowired
private IMessagePublisher messagePublisher;
public void sendMessageTest (){
// 向 队列:queue1 中发送消息 : message1(字符串)
Long ID=20L;
for(int i =0;i <10;i++) {
messagePublisher.rPush("wht:ora:20796:demo", ID);
System.out.println("\n\n队列:wht:ora:20796:demo 中发送消息\n\n");
}
}
控制类Ora20796DemoController.java
:
/**
* 消息队列
*/
@RequestMapping(value = "/hap/demo/send/mq")
@ResponseBody
public void sendMQ(){
service.sendMessageTest();
}
/**
接收者Ora20796DemoReceiver.java
注意要加:@Component 和 @QueueMonitor(queue = "wht:ora:20796:demo")
package wht.ora20796.components;
import com.hand.hap.message.IMessageConsumer;
import com.hand.hap.message.QueueMonitor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import wht.ora20796.dto.Ora20796Demo;
import wht.ora20796.mapper.Ora20796DemoMapper;
import java.util.Random;
@Component
@QueueMonitor(queue = "wht:ora:20796:demo")
public class Ora20796DemoReceiver implements IMessageConsumer {
@Autowired
private Ora20796DemoMapper ora20796DemoMapper;//自动装配机制
@Override
public void onMessage(Long id, String s) {
/**
* 5. 队列的消费者接收到DEMO的ID,随机更新ID对应的Name值,可参考之前的定时任务的逻辑。
* 6. 消费者在处理理前使⽤用 Thread.sleep ⽅方法模拟处理时长为30s的任务
*/
try {
Ora20796Demo criteria = new Ora20796Demo();
criteria.setId(id);
Ora20796Demo ora20796Demo = ora20796DemoMapper.selectOne(criteria);
Random random = new Random();
ora20796Demo.setName(random.nextInt()+"消息队列更新");
System.out.println("\n\n队列接收:wht:ora:20796:demo\n\n");
ora20796DemoMapper.updateByPrimaryKey(ora20796Demo);
Thread.sleep(30000); //1000 毫秒,也就是1秒.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
image.png
批量改造
批量启动队列消息
/*消息队列批量发送*/
startMessageQueue2:function(){
alert("批量")
var grid= $("#grid").data("kendoGrid");
var checked = grid.selectedDataItems();
var data = JSON.stringify(checked);
///hap/demo/send/mq
$.ajax({
url: '${base.contextPath}/ora/20796/hap/demo/send/moremq',
type: 'POST',
dataType: "json",
data:data,
contentType: "application/json",
success: function (result) {
if(result.success){
kendo.ui.showInfoDialog({
title: $l('hap.tip.info'),
message: $l("hap.success")
});
viewModel.query();
} else {
kendo.ui.showErrorDialog({
title: $l('hap.error'),
message : result.message
});
}
}
});
},
接口
/**
*多用户消息队列
*/
ResponseData sendMoreMessageTest(IRequest iRequest, List dto) throws Exception;
实现类
/**
* 多用户消息队列
* @param iRequest
* @param dto
* @throws Exception
*/
@Override
public ResponseData sendMoreMessageTest(IRequest iRequest, List dto) throws Exception {
ResponseData responseData = new ResponseData();
for(Ora20796Demo student:dto){
messagePublisher.rPush("wht:ora:20796:demo", student.getId());
System.out.println("\n\n队列:wht:ora:20796:demo"+student.getName()+ student.getId()+" 中发送消息\n\n");
}
return responseData;
}
控制类
/**
* 批量消息队列
*/
@RequestMapping(value = "/hap/demo/send/moremq")
@ResponseBody
public ResponseData sendMoreMQ(HttpServletRequest request, @RequestBody List dto){
IRequest iRequest = createRequestContext(request);
ResponseData responseData = new ResponseData();
try {
responseData = service.sendMoreMessageTest(iRequest,dto);
} catch (Exception e) {
responseData.setSuccess(false);
responseData.setMessage(e.getMessage());
}
return responseData;
}
接收者没有改动
package wht.ora20796.components;
import com.hand.hap.message.IMessageConsumer;
import com.hand.hap.message.QueueMonitor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import wht.ora20796.dto.Ora20796Demo;
import wht.ora20796.mapper.Ora20796DemoMapper;
import java.util.Random;
@Component
@QueueMonitor(queue = "wht:ora:20796:demo")
public class Ora20796DemoReceiver implements IMessageConsumer {
@Autowired
private Ora20796DemoMapper ora20796DemoMapper;//自动装配机制
@Override
public void onMessage(Long id, String s) {
/**
* 5. 队列的消费者接收到DEMO的ID,随机更新ID对应的Name值,可参考之前的定时任务的逻辑。
* 6. 消费者在处理理前使⽤用 Thread.sleep ⽅方法模拟处理时长为30s的任务
*/
try {
Ora20796Demo criteria = new Ora20796Demo();
criteria.setId(id);
Ora20796Demo ora20796Demo = ora20796DemoMapper.selectOne(criteria);
Random random = new Random();
ora20796Demo.setName(random.nextInt()+"消息队列更新");
System.out.println("\n\n队列接收:wht:ora:20796:demo+"+id+"\n\n");
ora20796DemoMapper.updateByPrimaryKey(ora20796Demo);
Thread.sleep(300); //1000 毫秒,也就是1秒.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}