RabbitMQ生产者消费者
package com.ra.car.rabbitMQ; import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeoutException; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.alibaba.fastjson.JSONObject;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.ConsumerCancelledException;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.ShutdownSignalException; /**
* 生产者,用来发送拍照指令
*
*
*/
public class RabbitMQProducer {
protected static final Logger logger = LoggerFactory.getLogger(RabbitMQProducer.class); private final static String QUEUE_NAME = "44b2fe8a-4d70-4a18-b75f-91a6f170bd16"; // 上送队列 private String message; public RabbitMQProducer() { } public RabbitMQProducer(String message) {
this.message = message;
} public void sendMessage(){
String replyQueueName = null; // 返回队列名 ConnectionFactory connFactory = null;
Connection conn = null;
Channel channel = null;
try {
connFactory = new ConnectionFactory();
connFactory.setHost("58.211.54.147");
connFactory.setUsername("customer");
connFactory.setPassword("123456");
connFactory.setPort(5672);
conn = connFactory.newConnection();
channel = conn.createChannel();
QueueingConsumer consumer = new QueueingConsumer(channel); Map<String, Object> param = new HashMap<String, Object>();
param.put("x-message-ttl", 600000);
param.put("x-expires", 86400000); // 返回队列
replyQueueName = channel.queueDeclare().getQueue();
channel.basicConsume(replyQueueName, true, consumer);
String corrId = UUID.randomUUID().toString(); // 用来表示返回队列结果的id,唯一
BasicProperties props = new BasicProperties.Builder().correlationId(corrId).replyTo(replyQueueName).build(); channel.queueDeclare(QUEUE_NAME, true, false, false, param);
channel.basicPublish("", QUEUE_NAME, props, message.getBytes());
logger.info("producer has published: \"" + message + "\"");
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (TimeoutException toe) {
toe.printStackTrace();
} catch (ShutdownSignalException e) {
e.printStackTrace();
} catch (ConsumerCancelledException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (channel != null)
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
if (conn != null)
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void main(String[] args) {
JSONObject json = new JSONObject();
json.put("msgId", "8801");
json.put("gpsNo", "001709270202");
json.put("channelId", "1");// 1,2 前置 后置
json.put("serialNo", "1133");
//RabbitMQProducer rb = new RabbitMQProducer(json.toString());
//Thread t = new Thread(rb);
//t.start();
//String str = "7e0805000901170427881200090003000001b6b5833313";
//System.out.println(str.substring(26, 36)+"**"+str.substring(36,str.length()-2));
}
}
package com.ra.car.rabbitMQ; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeoutException; import com.ra.truck.model.MessagePackage;
import com.ra.truck.service.MessagePackegerService; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.ContextLoader; import com.alibaba.fastjson.JSON;
import com.ra.car.utils.StringToT;
import com.ra.common.util.UuidUtil;
import com.ra.truck.service.DataCallBackService;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import com.rabbitmq.client.QueueingConsumer.Delivery; /**
* 消费者
*
*
*/
public class RabbitMQCustomer implements Runnable {
protected static final Logger logger = LoggerFactory
.getLogger(RabbitMQCustomer.class);
private final static String QUEUE_NAME = "adb65b08-a27d-42b0-b4ac-ff10422ac213"; private ConnectionFactory connFactory;
private Connection conn;
private Channel channel;
private Delivery delivery;
private QueueingConsumer consumer;
private SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); private MessagePackegerService messagepackegerService = (MessagePackegerService)ContextLoader
.getCurrentWebApplicationContext().getBean("MessagePackegerService");
private DataCallBackService dataCallBackService = (DataCallBackService) ContextLoader
.getCurrentWebApplicationContext().getBean("DataCallBackService"); /**
* 分开try...catch...,1.出现连接异常时,中断连接;2.出现消费数据异常时,继续去消费,不中断连接
*/
@Override
public void run() {
try {
connFactory = new ConnectionFactory();
connFactory.setHost("58.211.54.147");
connFactory.setUsername("customer");
connFactory.setPassword("123456");
connFactory.setPort(5672);
conn = connFactory.newConnection();
channel = conn.createChannel(); Map<String, Object> param = new HashMap<String, Object>();
param.put("x-message-ttl", 600000);
param.put("x-expires", 86400000); channel.queueDeclare(QUEUE_NAME, true, false, false, param); logger.info("listening for event message..."); consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer); while (true) {
try {
Thread.sleep(100);
delivery = consumer.nextDelivery();
// BasicProperties props = delivery.getProperties();
/*
* BasicProperties reply_props = new
* BasicProperties.Builder()
* .correlationId(props.getCorrelationId()).build();
*/
// String msg = new String(delivery.getBody());
logger.info("*****当前时间:" + df.format(new Date()) + "*****");
logger.info("*****原始数据为:" + JSON.toJSONString(delivery.getBody()) + "*****");
String msg = MQUtils.bytes2Hex(delivery.getBody());
logger.info("receive msg:" + msg); //RdDeviceCallBackDataDomain backDataDomain = new RdDeviceCallBackDataDomain();
//backDataDomain.setId(String.valueOf(System.currentTimeMillis()));
if (StringUtils.isNotBlank(msg)) {
MessagePackage msgPackeger = new MessagePackage();
if (msg.length() > 28) {
msg = msg.substring(0, msg.length()-2).replaceAll("7d02", "7e").replaceAll("7d01", "7d");//去掉标识位,转义还原
msgPackeger.setId(UuidUtil.create());
String messageId = msg.substring(2, 6);
msgPackeger.setMessageId(messageId);//消息Id
msgPackeger.setMessageProperty(msg.substring(6, 10));//消息体属性
msgPackeger.setImei(msg.substring(10, 22));//imi 终端手机号
msgPackeger.setSerialNumber(msg.substring(22, 26));//流水号
msgPackeger.setCheckCode(msg.substring(msg.length()-2, msg.length()));//校验码
if (StringUtils.isNotBlank(messageId) && messageId.equals("0801")) {
String msgBodyProperties = msg.substring(6, 10);// 消息体属性
String msgBodyProperties2 = StringToT.hexString2binaryString(msgBodyProperties);//消息属性二进制格式
String isSubpackage = msgBodyProperties2.substring(2, 3); //是否分
if ("1".equals(isSubpackage)) { String isSplitNumber = msg.substring(26, 30); // 分报数
String isSplit = msg.substring(30, 34);//消息流水号
msgPackeger.setMessageSplit(isSplitNumber + isSplit);
if("0001".equals(isSplit)) {
String mediaId = msg.substring(34, 42); msgPackeger.setMeidiaId(mediaId);
msgPackeger.setMessageBody(msg.substring(42, msg.length() - 2));
}else{
msgPackeger.setMessageSplit("0001");
List<MessagePackage> messagepackegerList=messagepackegerService.selectMessagepackeger(msgPackeger);
String meidiaId=messagepackegerList.get(0).getMeidiaId();
String mediabody = messagepackegerList.get(0).getMessageBody().substring(0,64);
msgPackeger.setMessageSplit(isSplitNumber + isSplit);
msgPackeger.setMeidiaId(meidiaId);
msgPackeger.setMessageBody(mediabody+msg.substring(34, msg.length()- 2));
}
} else {
String mediaId = msg.substring(26, 34);
msgPackeger.setMeidiaId(mediaId);
msgPackeger.setMessageBody(msg.substring(34, msg.length() - 2));
}
}else if(StringUtils.isNotBlank(messageId) && messageId.equals("0805")){
msgPackeger.setMessageBody(msg.substring(26, 36));
msgPackeger.setMeidiaId(msg.substring(36, msg.length()-2));
}else{
msgPackeger.setMessageBody(msg.substring(26, msg.length() - 2));//消息体
}
//保存校验码
msgPackeger.setCheckCode((msg.substring(msg.length()- 2,msg.length())));
dataCallBackService.insertDeviceRawDataOfOne(msgPackeger);
}
}
// 不用设置返回
/*
* String retMsg = "ok, give you reply:" + new
* String(msg.getBytes(), "utf-8");
* logger.info("Consumer中的返回队列名" + props.getReplyTo());
* channel.basicPublish("", QUEUE_NAME, reply_props,
* retMsg.getBytes());
*/
} catch (Exception e) {
logger.error("循环消费数据异常.....", e);
}
}
} catch (Exception e) {
logger.error("MQ connection error.....", e);
} finally {
try {
if (channel != null) {
logger.info("channel.close");
channel.close();
}
if (conn != null) {
logger.info("conn.close");
conn.close();
}
} catch (IOException e) {
logger.info("IOException");
} catch (TimeoutException e) {
logger.info("TimeoutException");
}
} }
}
RabbitMQ生产者消费者的更多相关文章
- rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。) 一个通用rabbitmq消费确认,快速并发运行的框架。
rabbitmq作为消息队列可以有消息消费确认机制,之前写个基于redis的通用生产者 消费者 并发框架,redis的list结构可以简单充当消息队列,但不具备消费确认机制,随意关停程序,会丢失一部分 ...
- RabbitMQ生产者消费者模型构建(三)
ConnectionFactory:获取连接(地址,端口号,用户名,密码,虚拟主机等) Connection:一个连接 Channel:数据通信信道,可发送.接收消息 Queue:具体的消息存储队列 ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- 生产者&消费者.py
1.最简单的 --生产者消费者 send.py# !/usr/bin/env python3.5# -*- coding:utf-8 -*-# __author__ == 'LuoTianShuai' ...
- 网络编程 生产者消费者模型 GiL
守护进程: 注意事项: 1.必须在p.start()前 2.守护进程不能开子进程 3.如果主进程的运行时间快于子进程,那么就只有主进程的结果,没有守护进程的结果,因为守护进程没有进行完.反之会得到两个 ...
- Celery 框架学习笔记(生产者消费者模式)
生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...
- day 28 :进程相关,进程池,锁,队列,生产者消费者模式
---恢复内容开始--- 前情提要: 一:进程Process 1:模块介绍 from multiprocessing import Process from multiprocessing impo ...
- 并发编程 - 进程 - 1.队列的使用/2.生产者消费者模型/3.JoinableQueue
1.队列的使用: 队列引用的前提: 多个进程对同一块共享数据的修改:要从硬盘读文件,慢,还要考虑上锁: 所以就出现了 队列 和 管道 都在内存中(快): 队列 = 管道 + 上锁 用队列的目的: 进程 ...
- python 并发编程 多进程 生产者消费者模型总结
生产者消费者模型总结 生产者消费者模型什么时候用? 1.程序中有两类角色 一类负责生产数据(生产者) 一类负责处理数据(消费者) 2.引入生产者消费者模型为了解决的问题是 平衡生产者与消费者之间的速度 ...
随机推荐
- 洛谷P4363 一双木棋chess [九省联考2018] 搜索+hash
正解:记搜+hash 解题报告: 传送门! 因为看到nm范围特别小,,,所以直接考虑爆搜(bushi 先考虑爆搜之后再想优化什么的嘛QwQ 首先对这种都要最优的,就可以直接把答案设为针对某一方,然后题 ...
- u-boot 编译,启动流程分析,移植
分析u-boot-1.1.6 的启动流程 移植u-boot 2012.04版本到JZ2440开发板 源码百度云链接:https://pan.baidu.com/s/10VnxfDWBqJVGY3SCY ...
- 二、Spring Boot 配置文件
1.配置文件 Spring Boot使用一个全局的配置文件,配置文件名是固定的 application.properties applicatioin.yml 配置文件的作用:修改Spring Boo ...
- MySQL中varchar最大长度是多少?
一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无 ...
- 最少步数(bfs)
最少步数 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...
- zookeeper(百度百科http://baike.baidu.com/view/3061646.htm?fr=aladdin)
ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务 ...
- [vue]webpack使用样式
webpack: 使用自己写样式 main.js导入全局生效 import Vue from 'vue' import App from './App.vue' import './index.css ...
- (转)从拜占庭将军问题谈谈为什么pow是目前最好的共识机制
我们知道基于区块链技术现在有很多的共识机制,包括不限于POW,POS,DPOS,PBFT……,我先不说为什么我最认可POW,我们先来看看著名的拜占庭将军问题: 拜占庭帝国即中世纪的土耳其,拥有巨大的财 ...
- tf中的run()与eval()【转载】
转自:https://blog.csdn.net/jiaoyangwm/article/details/79248535 1.eval() 其实就是tf.Tensor的Session.run() 的 ...
- 【Redis】主从同步
Redis提供了主从复制功能,主要是为了保证服务的高可用性.在redis.conf配置文件中通过设置,可以开启主从复制功能.或者在客户端中使用slaveof 命令开启该功能. slaveof < ...