技术标签: spring JAVA基础和应用 java 队列
一、安装及启动
1、将zip文件上传到linux的~下,然后解压:
执行:unzip rocketmq-all-4.4.0-bin-release.zip,若unzip命令不存在,执行:yum install -y unzip zip
2、移动并重命名
执行:mv rocketmq-all-4.4.0-bin-release /usr/local/rocketmq
3、进入/usr/local/rocketmq/bin目录下
执行:cd /usr/local/rocketmq/bin
4、如果是在真实的linux服务器上安装rocketmq,则内存是足够的,如果是在虚拟机上安装rocketmq进行学习用,可能虚拟机的内存只分配了1G,那么是不够用的。启动rocketmq可能会启动不成功。此时就先修改一下启动所需的内存参数。
(1)修改runserver.sh
执行:vi runserver.sh
将其内存修改为128m并保存,如下:
(2)修改runbroker.sh
同理将其修改为128m(与修改runserver.sh一样)
5、启动nameserver,在bin目录下执行:nohup sh mqnamesrv &,查看启动是否成功的日志命令:tail -f ~/logs/rocketmqlogs/namesrv.log ,打印如下表示启动成功:
6、启动broker,在bin目录下执行:nohup sh mqbroker -n localhost:9876 & ,也可以 nohup sh mqbroker -c ../conf/broker.conf -n 192.168.153.128:9876 autoCreateTopicEnable=true &
这样启动的服务器可以自动创建主题(客户端),不过生产一般不推荐.
查看日志命令:tail -f ~/logs/rocketmqlogs/broker.log,打印如下表示启动成功:
三、安装可视化插件
1、下载地址:https://pan.baidu.com/s/16ZoOkYEBtNq1sGp0cuk3cA 提取码:ms2g
2、上传到linux自己指定一个目录并使用unzip命令解压(步骤略,可参考上面rocketmq的上传解压步骤)
3、进入rocketmq-console/src/main/resources目录下,打开application.properties并修改保存如下:
4、进入‘\rocketmq-externals\rocketmq-console’文件夹,执行‘mvn clean package -Dmaven.test.skip=true’,编译生成,该过程耗时较长,最终生成成功后如下:
5、便已完成,会生成target目录,进入target目录后执行:java -jar rocketmq-console-ng-1.0.1.jar,启动完成后,
在浏览器输入:http://192.168.153.128:9876,出现如下界面
完毕!
生产者代码
MyProducer.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
public class MyProducer {
private final Logger logger = LoggerFactory.getLogger(MyProducer.class);
private DefaultMQProducer defaultMQProducer;
private String producerGroup;
private String namesrvAddr;
/**
* Spring bean init-method
*/
public void init() throws MQClientException {
// 参数信息
logger.info("DefaultMQProducer initialize!");
logger.info(producerGroup);
logger.info(namesrvAddr);
// 初始化
defaultMQProducer = new DefaultMQProducer(producerGroup);
defaultMQProducer.setNamesrvAddr(namesrvAddr);
defaultMQProducer.setInstanceName(String.valueOf(System.currentTimeMillis()));
defaultMQProducer.start();
System.out.println("DefaultMQProudcer start success!");
}
/**
* Spring bean destroy-method
*/
public void destroy() {
defaultMQProducer.shutdown();
}
public DefaultMQProducer getDefaultMQProducer() {
return defaultMQProducer;
}
// ---------------setter -----------------
public void setProducerGroup(String producerGroup) {
this.producerGroup = producerGroup;
}
public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
}
}
消费者代码
MyConsumer .java
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import com.alibaba.rocketmq.common.message.MessageExt;
import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel;
public class MyConsumer {
private final Logger logger = LoggerFactory.getLogger(MyConsumer.class);
private DefaultMQPushConsumer defaultMQPushConsumer;
private String namesrvAddr;
private String consumerGroup;
/**
*
* * Spring bean init-method
*
*
*/
public void init() throws InterruptedException, MQClientException {
// 参数信息
logger.debug("DefaultMQPushConsumer initialize!");
logger.debug(consumerGroup);
logger.debug(namesrvAddr);
// 一个应用创建一个Consumer,由应用来维护此对象,可以设置为全局对象或者单例<br>
// 注意:ConsumerGroupName需要由应用来保证唯一
defaultMQPushConsumer = new DefaultMQPushConsumer(consumerGroup);
defaultMQPushConsumer.setNamesrvAddr(namesrvAddr);
defaultMQPushConsumer.setInstanceName(String.valueOf(System.currentTimeMillis()));
// 订阅指定MyTopic下tags等于MyTag
defaultMQPushConsumer.subscribe("MyTopic", "MyTag");
// 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
// 如果非第一次启动,那么按照上次消费的位置继续消费
defaultMQPushConsumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
// 设置为集群消费(区别于广播消费)
defaultMQPushConsumer.setMessageModel(MessageModel.CLUSTERING);
defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() {
// 默认msgs里只有一条消息,可以通过设置consumeMessageBatchMaxSize参数来批量接收消息
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
MessageExt msg = msgs.get(0);
if (msg.getTopic().equals("MyTopic")) {
// TODO 执行Topic的消费逻辑
System.out.println("接收到了消息啊=========="+msg.toString());
if (msg.getTags() != null && msg.getTags().equals("MyTag")) {
// TODO 执行Tag的消费
}
}
// 如果没有return success ,consumer会重新消费该消息,直到return success
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// Consumer对象在使用之前必须要调用start初始化,初始化一次即可<br>
defaultMQPushConsumer.start();
logger.debug("DefaultMQPushConsumer start success!");
}
/**
* Spring bean destroy-method
*
*/
public void destroy() {
defaultMQPushConsumer.shutdown();
}
// ----------------- setter --------------------
public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
}
public void setConsumerGroup(String consumerGroup) {
this.consumerGroup = consumerGroup;
}
}
生产者配置文件producer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="myProducer" class="net.sinolbs.rocketmq.MyProducer" init-method="init"
destroy-method="destroy" scope="singleton">
<property name="producerGroup" value="MyProducerGroup" />
<property name="namesrvAddr" value="127.0.0.1:9876" />
</bean>
</beans>
消费者配置文件:consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean class="net.sinolbs.test.rocketmq.MyConsumer" init-method="init"
destroy-method="destroy" scope="singleton">
<property name="consumerGroup" value="MyConsumerGroup" />
<property name="namesrvAddr" value="127.0.0.1:9876" />
</bean>
</beans>
然后将这两个xml导入到spring的配置文件里
<import resource="classpath:rocketmq/producer.xml" />
<import resource="classpath:rocketmq/consumer.xml" />
到此就可以使用了。
rocketMq发送端代码:
package com.wechat.tool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.rocketmq.client.exception.MQClientException;
import com.alibaba.rocketmq.client.producer.DefaultMQProducer;
public class RocketMqProducer {
private final Logger logger = LoggerFactory.getLogger(RocketMqProducer.class);
private DefaultMQProducer defaultMQProducer;
private String producerGroup;
private String namesrvAddr;
/**
* Spring bean init-method
*/
public void init() throws MQClientException {
// 参数信息
logger.info("DefaultMQProducer initialize!");
logger.info(producerGroup);
logger.info(namesrvAddr);
// 初始化
defaultMQProducer = new DefaultMQProducer(producerGroup);
defaultMQProducer.setNamesrvAddr(namesrvAddr);
defaultMQProducer.setInstanceName(String.valueOf(System.currentTimeMillis()));
defaultMQProducer.start();
logger.info("DefaultMQProudcer start success!");
}
/**
* Spring bean destroy-method
*/
public void destroy() {
defaultMQProducer.shutdown();
}
public DefaultMQProducer getDefaultMQProducer() {
return defaultMQProducer;
}
// ---------------setter -----------------
public void setProducerGroup(String producerGroup) {
this.producerGroup = producerGroup;
}
public void setNamesrvAddr(String namesrvAddr) {
this.namesrvAddr = namesrvAddr;
}
}
该对象的实例初始化与销毁都是由spring来控制,RocketMqProducer需要保持单例,主要是由spring配置文件控制,下面是RocketMqProducer相关配置
<bean id="rocketMqProducer" class="com.wechat.tool.RocketMqProducer"
init-method="init" destroy-method="destroy" scope="singleton">
<property name="producerGroup" value="PushConsumer" />
<property name="namesrvAddr" value="127.0.0.1:9876" />
</bean>
springmvc控制层这块主要调用RocketMqProducer单例对象,对RocketMq进行消息队列的发送,下列只列出部分控制层代码
@Autowired
private RocketMqProducer rocketMqProducer;
@RequestMapping(value = "/coupon/couponsend.htm")
@ResponseBody()
public Map<String,String> couponsend(){
String sendStatus ="";
String msgId ="";
try{
String msgtext="优惠券领取"+DTUtil.getTodayString4();
Message msg = new Message("PushTopic",
"push",
"coupon"+DTUtil.getNowLongTime(),
msgtext.getBytes());
SendResult result = rocketMqProducer.getDefaultMQProducer().send(msg);
System.out.println("id:" + result.getMsgId() +
" result:" + result.getSendStatus());
msgId = result.getMsgId();
sendStatus=result.getSendStatus()+"";
}catch (Exception e) {
e.printStackTrace();
}
Map<String,String> m=new HashMap<String, String>();
m.put("sendStatus", sendStatus);
m.put("msgId", msgId);
return m;
}
rocketMq消费者端:
package com.wechat.test;
import java.util.List;
import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere;
import com.alibaba.rocketmq.common.message.Message;
import com.alibaba.rocketmq.common.message.MessageExt;
public class PushConsumer {
public static void main(String[] args){
DefaultMQPushConsumer consumer =
new DefaultMQPushConsumer("PushConsumer");
consumer.setNamesrvAddr("127.0.0.1:9876");
try {
//订阅PushTopic下Tag为push的消息
consumer.subscribe("PushTopic", "push");
//程序第一次启动从消息队列头取数据
consumer.setConsumeFromWhere(
ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.registerMessageListener(
new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(
List<MessageExt> list,
ConsumeConcurrentlyContext Context) {
Message msg = list.get(0);
System.out.println(msg.getKeys());
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}
);
consumer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
消费者开启后就不用关闭
文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大
文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码
文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版
文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗
文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程
文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0
文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader
文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型
文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写
文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录
文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点
文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文