linux设置rocketmq自启动

linux 查看服务是否自启动用命令

chkconfig  –list

因为rocketmq不是linux内置的服务,所以需要建立脚本,让linux识别为自身服务。

建立脚本的位置就在/etc/init.d/ 目录下

先在任意目录创建rocketmq.sh文件

文件内容为:

!/usr/bin/env bash
script starts and stops the rocketmq daemon
#
chkconfig: - 85 15
export JAVA_HOME=/home/install/jdk
ROCKETMQ_HOME=/home/install/rocketmq
ROCKETMQ_BIN=${ROCKETMQ_HOME}/bin
ADDR=hostname -i:9876
LOG_DIR=${ROCKETMQ_HOME}/logs
NAMESERVER_LOG=${LOG_DIR}/namesrv.log
BROKER_LOG=${LOG_DIR}/broker.log
start() {
if [ ! -d ${LOG_DIR} ];then
mkdir ${LOG_DIR}
fi
cd ${ROCKETMQ_HOME}
nohup sh bin/mqnamesrv > ${NAMESERVER_LOG} 2>&1 &
echo -n "The Name Server boot success…"
nohup sh bin/mqbroker -n ${ADDR} > ${BROKER_LOG} 2>&1 &
echo -n "The broker[%s, ${ADDR}] boot success…"
}
stop() {
cd ${ROCKETMQ_HOME}
sh bin/mqshutdown broker
sleep 1
sh bin/mqshutdown namesrv
}
restart() {
stop
sleep 5
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 2
esac

JAVA_HOME和ROCKETMQ_HOME根据你的安装目录设置,jdk设置参考文章 jdk设置

设置文件为可执行

chmod a+x rocketmq.sh

拷贝到 /etc/init.d/目录下

sudo mv rocketmq.sh /etc/init.d/rocketmq

添加到服务

chkconfig –add rocketmq

把服务设置为开机自启动


chkconfig rocketmq on

在看看服务是否已经设置好

chkconfig  –list

服务启动 service rocketmq start

服务关闭 service rocketmq stop

服务重启 service rocketmq restart

搭建的oracle监听又不行了

才发现netca里listener的hostname是bogon, ping bogon发现不是127.0.0.1,于是把bogon指定ip为127.0.0.1

  1).修改/etc/sysconfig/network里面的主机名字。
          [root@bogon ~]#  vi /etc/sysconfig/network

               NETWORKING=yes
             HOSTNAME=bogon                // 在这修改 hostname 为 bogon
     2).修改/etc/hosts里面的名字
          [root@bogon ~]#  vi /etc/hosts
             127.0.0.1               bogon
     3).不需要重启主机,最后在终端下执行:
        [root@bogon ~]# hostname  bogon      // bogon 为修改的hostname

    然后重启服务器,启动数据库,启动监听,不行,然后,再重启数据库,发现可以了,神奇的oracle。

附一个oracle监听原理图

客户端根据tnsname.ora找服务端的监听listener.ora,

附配置文件,服务器端

奇怪host有变成localhost了。

linux下安装oracle

参考了https://www.cnblogs.com/mmzs/p/9033112.html

我的虚拟机是centos,里面安装了oracle, 宿主本机电脑,通过hyper-v的内部网络(nat)连接虚拟机。

虚拟机配置:

tnsnames.ora

ORCL11G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.137.3)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl11g.us.oracle.com)
)
)

listener.ora

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)

ADR_BASE_LISTENER = /data/oracle

服务端运行lsnrctl status,查看监听是否配置正确,可以反复使用lsnrctl stop,lsnrctl top来启动停止监听服务。知道出现


标识监听成功,如果不能够,可以用netca命令,重新配置监听。

tnsping tnsnames.ora中的服务名称,看网络是否正常

例如tnsping ORCL11G

标识网络没有问题。

客户端:本机电脑如何连接呢?

运行net manager,按照服务端的 tnsnames.ora ,来创建服务命名


记得把scott/tiger测试用户解锁,有利于测试是否连通。

客户端的tnsnames.ora

客户端连接截图

也可以通过这种方式来连接

hyper-v内部网络设置

内部网络,就是nat,其他还有桥接,专用网络。

首先vi /etc/sysconfig/network-scripts/ifcfg-eth0 ,

修改下面几项

BOOTPROTO=static
IPADDR=192.168.137.3
NETMASK=255.255.255.0
GATEWAY=192.168.137.1
DNS1=192.168.137.1
ONBOOT=yes

然后重启网络

service network restart

jar启动脚本

nohup java -noverify -server -Xmx1024M -Xms1024M -Xmn512M  -XX:SurvivorRatio=2 -Xss256k  -XX:+ExplicitGCInvokesConcurrent -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128M -XX:+UseFastAccessorMethods -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:logs/gc.log  -XX:+HeapDumpOnOutOfMemoryError  -Dcom.sun.management.jmxremote  -Dcom.sun.management.jmxremote.port=26696 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.103.25  -jar *.jar --spring.profiles.active=prod >logs/server.log 2>&1 & tail -f logs/server.log

linux下设置tomcat自启动

vi /etc/init.d/tomcat


#!/bin/sh
# chkconfig: 345 99 10
# description: Auto-starts tomcat
# /etc/init.d/tomcat
# Tomcat auto-start
# Source function library.
#. /etc/init.d/functions
# source networking configuration.
#. /etc/sysconfig/network
RETVAL=0
export JRE_HOME=/home/jdk/jdk/jre
export CATALINA_HOME=/home/tomcat/tomcat
export CATALINA_BASE=/home/tomcat/tomcat
start()
{
        if [ -f $CATALINA_HOME/bin/startup.sh ];
          then
            echo $"Starting Tomcat"
                $CATALINA_HOME/bin/startup.sh
            RETVAL=$?
            echo " OK"
            return $RETVAL
        fi
}
stop()
{
        if [ -f $CATALINA_HOME/bin/shutdown.sh ];
          then
            echo $"Stopping Tomcat"
                $CATALINA_HOME/bin/shutdown.sh
            RETVAL=$?
            sleep 1
            ps -fwwu tomcat | grep apache-tomcat|grep -v grep | grep -v PID | awk '{print $2}'|xargs kill -9
            echo " OK"
            # [ $RETVAL -eq 0 ] && rm -f /var/lock/...
            return $RETVAL
        fi
}

case "$1" in
 start)
        start
        ;;
 stop)
        stop
        ;;

 restart)
         echo $"Restaring Tomcat"
         $0 stop
         sleep 1
         $0 start
         ;;
 *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac
exit $RETVAL

然后sudo chmod +x /etc/init.d/tomcat

chkconfig –add tomcat

chkconfig tomcat on

serice tomcat start

java虚拟机asm底层代码分析

java代码运行在虚拟机,虚拟机是如何运行java代码的?

首先虚拟机把数据和方法地址入栈,然后再出栈放置到局部变量。

数据和方法进入的栈,叫做操作数栈,是用来把指令和数据送入至cpu,来运行代码的堆栈。

cpu先把数据存入操作数栈中,然后在出栈,放入到局部变量表中。局部变量表暂存局部变量的内存池。

java虚拟机运行的是class文件,查看class文件指令,可以通过idea的view->show bytecode可以查看。记住一定要选中java文件,才行。

下面一个实例说明java class指令如何运行

java 虚拟机指令

如何避免消息重复消费,消息幂等性

消息幂等性,就是同一个消息多次消费,同一次消费效果一样。解决办法有多种

1是给消息一个唯一编码,每次消费后,记录一下。再次消费时,比对一下是否消费过,如果消费过,就不消费。

2.把消息编码放到redis的set里,因为set是不可重复的,只需要从set中比对,如果存在,则表示已经消费过,不再重复消费。

cdi上下文依赖注入

cdi是web容器调用对象的方式,通过依赖注入的方式解耦容器与java对象, 为了解决EJB、javabean被web层组件引用困难的问题 。

cdi是j2ee规范,spring,jboss seam,ejb都实现了cdi规范。所以spring的依赖注入是遵从j2ee的cdi规范的。

所以了解java规范协议是很有益的,让你知道为什么厂商支持这种技术,为了什么目的采用这种技术等等问题。

logback开发测试环境日志文件位置定制

logback日志文件生成位置需要指定绝对路径,这块不能指定项目相对路径,但是开发环境和测试环境路径又不一致。所以使用springProfile来制定开发还是测试路径。

<springProfile name="prod">
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/xxx/software/xxx/logs/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/xxx/software/xxx/logs/%d{yyyy-MM,aux}/server-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100M</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>

</appender>
</springProfile>
<springProfile name="test">
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/xxx/software/test/xxx/logs/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/xxx/software/test/xxx/logs/%d{yyyy-MM,aux}/server-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100M</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>-->
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>

</appender>
</springProfile>