HAP_消息队列练习1

业务需求:

批量插入/更新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();
        }
    }

}

你可能感兴趣的:(HAP_消息队列练习1)