ActiveMQ 的安装与使用(单节点)
IP: 192.168.x.x
环 境: CentOS 7 、 JDK8
1、 安装 JDK 并配置环境变量(略)
JAVA_HOME=/usr/local/java/jdk1.8.0_172
2、 下载 Linux 版的 ActiveMQ(apache-activemq-5.11.1-bin.tar.gz)
$ wget http://apache.fayea.com/activemq/5.11.1/apache-activemq-5.11.1-bin.tar.gz
3、 解压安装
$ tar -zxvf apache-activemq-5.11.1-bin.tar.gz
$ mv apache-activemq-5.11.1 activemq
如果启动脚本 activemq 没有可执行权限,此时则需要授权(此步可选)
$ cd /data//wusc/activemq/bin/
$ chmod 755 ./activemq
4、 防火墙中打开对应的端口
ActiveMQ 需要用到两个端口
一个是消息通讯的端口(默认为 61616)
一个是管理控制台端口(默认为 8161)
vi conf/jetty.xml 中修改,如下:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
</bean>
# vi /etc/sysconfig/iptables
添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 61616 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8161 -j ACCEPT
重启防火墙:
# service iptables restart
5、 启动
$ cd /data/wusc/activemq/bin
$ ./activemq start
6、 打开管理界面:http://192.168.4.101:8161
默认用户名和密码为:admin/admin
7、 安全配置(消息安全)
ActiveMQ 如果不加入安全机制的话,任何人只要知道消息服务的具体地址(包括 ip,端口,消息地址
[队列或者主题地址],),都可以肆无忌惮的发送、接收消息。关于 ActiveMQ 安装配置
http://activemq.apache.org/security.html
ActiveMQ 的消息安全配置策略有多种,我们以简单授权配置为例:
在 conf/activemq.xml 文件中在 broker 标签最后加入以下内容即可:
$ vi /home/wusc/activemq-01/conf/activemq.xml
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="wusc" password="wusc.123" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
定义了一个 wusc 用户,密码为 wusc.123,角色为 users,admins
设置 admin 的用户名和密码:
$ vi /data/wusc/activemq/conf/jetty.xml
<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<property name="authenticate" value="true" />
</bean>
确保 authenticate 的值为 true(默认)
控制台的登录用户名密码保存在 conf/jetty-realm.properties 文件中,内容如下:
$ vi /data/wusc/activemq/conf/jetty-realm.properties
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
admin: wusc.123, admin
注意:用户名和密码的格式是
用户名 : 密码 ,角色名
重启:
$ /data/wusc/activemq/bin/activemq restart
设置开机启动:
# vi /etc/rc.local
加入以下内容
## ActiveMQ
su - wusc -c '/data/wusc/activemq/bin/activemq start'
8、 MQ 消息生产者也与消息消费者的 Demo 样例讲解与演示
创建Maven project
org.apache.maven.archetypes maven-archietype-quickstart
artifact id: jmstest
添加 pom.xml
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>3.16</version>
</dependency>
Queue消息发送实例代码:
建包
com.sishuok.jmstest.queue
建类
QueueSender
organize imports -->javax.jmx.Session
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class jmsSend {
public static void main(String[] args) throws Exception {
ConnectionFactory connectionFactory = new
ActiveMQConnectionFactory("tcp://192.168.x.x:61616");
Connection connection = connectionFactory.createConnecton();
connection.start();
Session session = connection.createConnecton(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("my-queue");
MessageProducer producer = session.createProducer(distination);
for(int i=0; i<3; i++) {
TextMessage message = session.createTextMessage("message--"+i);
Thread.sleep(1000);
//通过消息生产者发出的消息
producer.send(message);
}
session.commit();
session.close();
sonnection.close();
}
}
QueueReciver
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class JmsReceiver {
public static void main(String[] args) throws Exception {
ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://192.168.x.x:61616");
Connection connection = cf.createConnecton();
connection.start();
final Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE;
Session.AUTO_ACKNOWLEDGE);
Destination distination = session.createQueue(my-queue);
MessageConsumer consumer = session.createConsumer(destination);
int i=0;
while(i<3) {
i++;
TextMessage message = (TextMessage) consumer.receiver();
session.commit();
System.out.println("收到消息: " + message.getText());
}
session.close();
connection.close();
}
}