1. package com.ra.car.rabbitMQ;
  2.  
  3. import java.io.IOException;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import java.util.UUID;
  7. import java.util.concurrent.TimeoutException;
  8.  
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11.  
  12. import com.alibaba.fastjson.JSONObject;
  13. import com.rabbitmq.client.AMQP.BasicProperties;
  14. import com.rabbitmq.client.Channel;
  15. import com.rabbitmq.client.Connection;
  16. import com.rabbitmq.client.ConnectionFactory;
  17. import com.rabbitmq.client.ConsumerCancelledException;
  18. import com.rabbitmq.client.QueueingConsumer;
  19. import com.rabbitmq.client.ShutdownSignalException;
  20.  
  21. /**
  22. * 生产者,用来发送拍照指令
  23. *
  24. *
  25. */
  26. public class RabbitMQProducer {
  27. protected static final Logger logger = LoggerFactory.getLogger(RabbitMQProducer.class);
  28.  
  29. private final static String QUEUE_NAME = "44b2fe8a-4d70-4a18-b75f-91a6f170bd16"; // 上送队列
  30.  
  31. private String message;
  32.  
  33. public RabbitMQProducer() {
  34.  
  35. }
  36.  
  37. public RabbitMQProducer(String message) {
  38. this.message = message;
  39. }
  40.  
  41. public void sendMessage(){
  42. String replyQueueName = null; // 返回队列名
  43.  
  44. ConnectionFactory connFactory = null;
  45. Connection conn = null;
  46. Channel channel = null;
  47. try {
  48. connFactory = new ConnectionFactory();
  49. connFactory.setHost("58.211.54.147");
  50. connFactory.setUsername("customer");
  51. connFactory.setPassword("123456");
  52. connFactory.setPort(5672);
  53. conn = connFactory.newConnection();
  54. channel = conn.createChannel();
  55. QueueingConsumer consumer = new QueueingConsumer(channel);
  56.  
  57. Map<String, Object> param = new HashMap<String, Object>();
  58. param.put("x-message-ttl", 600000);
  59. param.put("x-expires", 86400000);
  60.  
  61. // 返回队列
  62. replyQueueName = channel.queueDeclare().getQueue();
  63. channel.basicConsume(replyQueueName, true, consumer);
  64. String corrId = UUID.randomUUID().toString(); // 用来表示返回队列结果的id,唯一
  65. BasicProperties props = new BasicProperties.Builder().correlationId(corrId).replyTo(replyQueueName).build();
  66.  
  67. channel.queueDeclare(QUEUE_NAME, true, false, false, param);
  68. channel.basicPublish("", QUEUE_NAME, props, message.getBytes());
  69. logger.info("producer has published: \"" + message + "\"");
  70. } catch (IOException ioe) {
  71. ioe.printStackTrace();
  72. } catch (TimeoutException toe) {
  73. toe.printStackTrace();
  74. } catch (ShutdownSignalException e) {
  75. e.printStackTrace();
  76. } catch (ConsumerCancelledException e) {
  77. e.printStackTrace();
  78. } catch (Exception e) {
  79. e.printStackTrace();
  80. } finally {
  81. if (channel != null)
  82. try {
  83. channel.close();
  84. } catch (IOException e) {
  85. e.printStackTrace();
  86. } catch (TimeoutException e) {
  87. e.printStackTrace();
  88. }
  89. if (conn != null)
  90. try {
  91. conn.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. }
  97.  
  98. public static void main(String[] args) {
  99. JSONObject json = new JSONObject();
  100. json.put("msgId", "8801");
  101. json.put("gpsNo", "001709270202");
  102. json.put("channelId", "1");// 1,2 前置 后置
  103. json.put("serialNo", "1133");
  104. //RabbitMQProducer rb = new RabbitMQProducer(json.toString());
  105. //Thread t = new Thread(rb);
  106. //t.start();
  107. //String str = "7e0805000901170427881200090003000001b6b5833313";
  108. //System.out.println(str.substring(26, 36)+"**"+str.substring(36,str.length()-2));
  109. }
  110. }
  1. package com.ra.car.rabbitMQ;
  2.  
  3. import java.io.IOException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.concurrent.TimeoutException;
  10.  
  11. import com.ra.truck.model.MessagePackage;
  12. import com.ra.truck.service.MessagePackegerService;
  13.  
  14. import org.apache.commons.lang3.StringUtils;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.web.context.ContextLoader;
  18.  
  19. import com.alibaba.fastjson.JSON;
  20. import com.ra.car.utils.StringToT;
  21. import com.ra.common.util.UuidUtil;
  22. import com.ra.truck.service.DataCallBackService;
  23. import com.rabbitmq.client.Channel;
  24. import com.rabbitmq.client.Connection;
  25. import com.rabbitmq.client.ConnectionFactory;
  26. import com.rabbitmq.client.QueueingConsumer;
  27. import com.rabbitmq.client.QueueingConsumer.Delivery;
  28.  
  29. /**
  30. * 消费者
  31. *
  32. *
  33. */
  34. public class RabbitMQCustomer implements Runnable {
  35. protected static final Logger logger = LoggerFactory
  36. .getLogger(RabbitMQCustomer.class);
  37. private final static String QUEUE_NAME = "adb65b08-a27d-42b0-b4ac-ff10422ac213";
  38.  
  39. private ConnectionFactory connFactory;
  40. private Connection conn;
  41. private Channel channel;
  42. private Delivery delivery;
  43. private QueueingConsumer consumer;
  44. private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  45.  
  46. private MessagePackegerService messagepackegerService = (MessagePackegerService)ContextLoader
  47. .getCurrentWebApplicationContext().getBean("MessagePackegerService");
  48. private DataCallBackService dataCallBackService = (DataCallBackService) ContextLoader
  49. .getCurrentWebApplicationContext().getBean("DataCallBackService");
  50.  
  51. /**
  52. * 分开try...catch...,1.出现连接异常时,中断连接;2.出现消费数据异常时,继续去消费,不中断连接
  53. */
  54. @Override
  55. public void run() {
  56. try {
  57. connFactory = new ConnectionFactory();
  58. connFactory.setHost("58.211.54.147");
  59. connFactory.setUsername("customer");
  60. connFactory.setPassword("123456");
  61. connFactory.setPort(5672);
  62. conn = connFactory.newConnection();
  63. channel = conn.createChannel();
  64.  
  65. Map<String, Object> param = new HashMap<String, Object>();
  66. param.put("x-message-ttl", 600000);
  67. param.put("x-expires", 86400000);
  68.  
  69. channel.queueDeclare(QUEUE_NAME, true, false, false, param);
  70.  
  71. logger.info("listening for event message...");
  72.  
  73. consumer = new QueueingConsumer(channel);
  74. channel.basicConsume(QUEUE_NAME, true, consumer);
  75.  
  76. while (true) {
  77. try {
  78. Thread.sleep(100);
  79. delivery = consumer.nextDelivery();
  80. // BasicProperties props = delivery.getProperties();
  81. /*
  82. * BasicProperties reply_props = new
  83. * BasicProperties.Builder()
  84. * .correlationId(props.getCorrelationId()).build();
  85. */
  86. // String msg = new String(delivery.getBody());
  87. logger.info("*****当前时间:" + df.format(new Date()) + "*****");
  88. logger.info("*****原始数据为:" + JSON.toJSONString(delivery.getBody()) + "*****");
  89. String msg = MQUtils.bytes2Hex(delivery.getBody());
  90. logger.info("receive msg:" + msg);
  91.  
  92. //RdDeviceCallBackDataDomain backDataDomain = new RdDeviceCallBackDataDomain();
  93. //backDataDomain.setId(String.valueOf(System.currentTimeMillis()));
  94. if (StringUtils.isNotBlank(msg)) {
  95. MessagePackage msgPackeger = new MessagePackage();
  96. if (msg.length() > 28) {
  97. msg = msg.substring(0, msg.length()-2).replaceAll("7d02", "7e").replaceAll("7d01", "7d");//去掉标识位,转义还原
  98. msgPackeger.setId(UuidUtil.create());
  99. String messageId = msg.substring(2, 6);
  100. msgPackeger.setMessageId(messageId);//消息Id
  101. msgPackeger.setMessageProperty(msg.substring(6, 10));//消息体属性
  102. msgPackeger.setImei(msg.substring(10, 22));//imi 终端手机号
  103. msgPackeger.setSerialNumber(msg.substring(22, 26));//流水号
  104. msgPackeger.setCheckCode(msg.substring(msg.length()-2, msg.length()));//校验码
  105. if (StringUtils.isNotBlank(messageId) && messageId.equals("0801")) {
  106. String msgBodyProperties = msg.substring(6, 10);// 消息体属性
  107. String msgBodyProperties2 = StringToT.hexString2binaryString(msgBodyProperties);//消息属性二进制格式
  108. String isSubpackage = msgBodyProperties2.substring(2, 3); //是否分
  109. if ("1".equals(isSubpackage)) {
  110.  
  111. String isSplitNumber = msg.substring(26, 30); // 分报数
  112. String isSplit = msg.substring(30, 34);//消息流水号
  113. msgPackeger.setMessageSplit(isSplitNumber + isSplit);
  114. if("0001".equals(isSplit)) {
  115. String mediaId = msg.substring(34, 42);
  116.  
  117. msgPackeger.setMeidiaId(mediaId);
  118. msgPackeger.setMessageBody(msg.substring(42, msg.length() - 2));
  119. }else{
  120. msgPackeger.setMessageSplit("0001");
  121. List<MessagePackage> messagepackegerList=messagepackegerService.selectMessagepackeger(msgPackeger);
  122. String meidiaId=messagepackegerList.get(0).getMeidiaId();
  123. String mediabody = messagepackegerList.get(0).getMessageBody().substring(0,64);
  124. msgPackeger.setMessageSplit(isSplitNumber + isSplit);
  125. msgPackeger.setMeidiaId(meidiaId);
  126. msgPackeger.setMessageBody(mediabody+msg.substring(34, msg.length()- 2));
  127. }
  128. } else {
  129. String mediaId = msg.substring(26, 34);
  130. msgPackeger.setMeidiaId(mediaId);
  131. msgPackeger.setMessageBody(msg.substring(34, msg.length() - 2));
  132. }
  133. }else if(StringUtils.isNotBlank(messageId) && messageId.equals("0805")){
  134. msgPackeger.setMessageBody(msg.substring(26, 36));
  135. msgPackeger.setMeidiaId(msg.substring(36, msg.length()-2));
  136. }else{
  137. msgPackeger.setMessageBody(msg.substring(26, msg.length() - 2));//消息体
  138. }
  139. //保存校验码
  140. msgPackeger.setCheckCode((msg.substring(msg.length()- 2,msg.length())));
  141. dataCallBackService.insertDeviceRawDataOfOne(msgPackeger);
  142. }
  143. }
  144. // 不用设置返回
  145. /*
  146. * String retMsg = "ok, give you reply:" + new
  147. * String(msg.getBytes(), "utf-8");
  148. * logger.info("Consumer中的返回队列名" + props.getReplyTo());
  149. * channel.basicPublish("", QUEUE_NAME, reply_props,
  150. * retMsg.getBytes());
  151. */
  152. } catch (Exception e) {
  153. logger.error("循环消费数据异常.....", e);
  154. }
  155. }
  156. } catch (Exception e) {
  157. logger.error("MQ connection error.....", e);
  158. } finally {
  159. try {
  160. if (channel != null) {
  161. logger.info("channel.close");
  162. channel.close();
  163. }
  164. if (conn != null) {
  165. logger.info("conn.close");
  166. conn.close();
  167. }
  168. } catch (IOException e) {
  169. logger.info("IOException");
  170. } catch (TimeoutException e) {
  171. logger.info("TimeoutException");
  172. }
  173. }
  174.  
  175. }
  176. }

RabbitMQ生产者消费者的更多相关文章

  1. rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。) 一个通用rabbitmq消费确认,快速并发运行的框架。

    rabbitmq作为消息队列可以有消息消费确认机制,之前写个基于redis的通用生产者 消费者 并发框架,redis的list结构可以简单充当消息队列,但不具备消费确认机制,随意关停程序,会丢失一部分 ...

  2. RabbitMQ生产者消费者模型构建(三)

    ConnectionFactory:获取连接(地址,端口号,用户名,密码,虚拟主机等) Connection:一个连接 Channel:数据通信信道,可发送.接收消息 Queue:具体的消息存储队列 ...

  3. 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

    1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...

  4. 生产者&消费者.py

    1.最简单的 --生产者消费者 send.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai' ...

  5. 网络编程 生产者消费者模型 GiL

    守护进程: 注意事项: 1.必须在p.start()前 2.守护进程不能开子进程 3.如果主进程的运行时间快于子进程,那么就只有主进程的结果,没有守护进程的结果,因为守护进程没有进行完.反之会得到两个 ...

  6. Celery 框架学习笔记(生产者消费者模式)

    生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...

  7. day 28 :进程相关,进程池,锁,队列,生产者消费者模式

    ---恢复内容开始--- 前情提要: 一:进程Process  1:模块介绍 from multiprocessing import Process from multiprocessing impo ...

  8. 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue

    1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...

  9. python 并发编程 多进程 生产者消费者模型总结

    生产者消费者模型总结 生产者消费者模型什么时候用? 1.程序中有两类角色 一类负责生产数据(生产者) 一类负责处理数据(消费者) 2.引入生产者消费者模型为了解决的问题是 平衡生产者与消费者之间的速度 ...

随机推荐

  1. 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

    一.Java虚拟机内存区域如何划分 1.Java虚拟机内存区域的划分 区域名称 作用(用途) 类型 特点 虚拟机规定异常情况 内存分配与回收 其他说明 1 程序计数器 指示当前正在执行的字节码指令地址 ...

  2. JavaScript字符串String

    JavaScript中String类型用于表示由零个或者多个16位Unicode字符组成的字符序列即字符串:同时字符串可以用单引号或双引号表示. 下面是一些特殊的字面量: 字面量 含义\n 换行\t ...

  3. 关于eclipse调试时程序控制台不能自动打开

      对于这个程序,在刚开始的时候,没有敲上22,29,33行的打印语句时,在调试的时候不会自动弹开控制台,所以一直在怀疑代码可能出错了.因此可以自己手动打开,但是如果敲上那些代码,系统可以自动弹开控制 ...

  4. 用CSS来画空心三角形的方法

    画这里三角形的方法: 用CSS来实现:整个弹框的ID是#favoriteOptionMenus,对于#favoriteOptionMenus这个元素设置:before和:after的样式,让:befo ...

  5. RN-ios模拟器上调出中文输入法

    react-native 项目:在ios模拟器上需要拼写汉字,步骤是, 1.在模拟器的设置-通用-语言与地区-iphone语言设置为:简体中文 2.模拟器的 Hardware-Keyboard-勾选下 ...

  6. python-->(set /dict)交集 差集 并集 补集(功能用来做交差并补的)

    # ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...

  7. 进程理论 阻塞非阻塞 同步异步 I/O操作

    1.什么是进程 进程指的是一个正在运行的程序,进程是用来描述程序执行过程的虚拟概念 进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来的 2.操作系统 操作系统 ...

  8. vue 验证码倒计时

    //html <div class="input-div" v-show="formData.phone"> <input type=&quo ...

  9. 定义结构体和table type

    1: 在se11 中创建结构体 2: 定义一个内表, row type 使用structure类型,将会具有structure的字段. 3:在代码中 使用 结构体和table  type *& ...

  10. poj3278 Catch That Cow(简单的一维bfs)

    http://poj.org/problem?id=3278                                                                       ...