一、浩言
我們要變的變態,才能吸引更多的變態。
二、背景
最近在看消息隊列的東西,準備引入到項目中使用,一直說要自己先學會使用,在使用中學習。所以這算是新年的第一個周末就要加班,就在網上找資料自己嘗試配置下。順便紀錄下經歷了,都是有坑要去踩的。
三、ActiveMQ 在Windows下的使用
我修改了配置文件activemq.xml,將0.0.0.0改成了127.0.0.1
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://127.0.0.1:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600000"/>
<transportConnector name="amqp" uri="amqp://127.0.0.1:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600000"/>
<transportConnector name="stomp" uri="stomp://127.0.0.1:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600000"/>
<transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600000"/>
<transportConnector name="ws" uri="ws://127.0.0.1:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600000"/>
</transportConnectors>
注意點:我在測試的時候一直報1G要大于maxFrameSize的100M,所以我在這個后面加了三個0
然后啟動啟動active
Paste_Image.png
Paste_Image.png
我們在windows下使用這個命令查看端口netstat -ano linux下可以使用netstat -lntp查看
Paste_Image.png
在瀏覽器中輸入:http://127.0.0.1:8161/admin/index.jsp會有如下顯示
active-mq.png
<?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:amq="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61616"></property>
<!-- <property name="brokerURL" value="http://127.0.0.1:61616"></property> -->
<property name="useAsyncSend" value="true"></property>
<property name="alwaysSessionAsync" value="true"></property>
<property name="useDedicatedTaskRunner" value="true"></property>
</bean>
<!-- 發送消息的目的地 -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<!-- 消息隊列的名字 -->
<constructor-arg value="mahone.queue"/>
</bean>
</beans>
注意點:我在這里面看到的我有個注釋的配置brokerURL,我剛剛開始的時候一直配置成http...,然后怎么測試都不通,最后才發現是自己這里配置錯了。
Paste_Image.png
下面附上測試代碼
package com.mouse.moon.test.mq;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMq {
public static void sendWithAuto(ApplicationContext context) {
ActiveMQConnectionFactory factory = null;
Connection conn = null;
Destination destination = null;
Session session = null;
MessageProducer producer = null;
try {
destination = (Destination) context.getBean("destination");
factory = (ActiveMQConnectionFactory) context.getBean("targetConnectionFactory");
conn = factory.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("...Hello JMS-4!");
producer.send(message);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {//關閉生產者
producer.close();
producer = null;
} catch (Exception e) {
}
try {//關閉session
session.close();
session = null;
}
catch (Exception e) {
}
try { //停止連接
conn.stop();
} catch (Exception e) {
}
try {//關閉連接
conn.close();
} catch (Exception e) {
}
}
}
public static void main(String[] args) {
System.out.println("-------------start--------------");
final ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/xml/activemq.xml");
sendWithAuto(context);
System.out.println("-------------end---------------");
}
}
Paste_Image.png
Paste_Image.png
在做測試的時候還遇到如下問題
org.apache.activemq.ConfigurationException: There are 1 consumer options that couldn't be set on the consumer. Check the options are spelled correctly. Unknown parameters=[{perfetchSize=100}]. This consumer cannot be started.
這是在設置名字的時候附帶的參數,我把這個去掉了就只能看到生產者的名字是"mahone.queue""
消費端代碼:
package com.mouse.moon.test.mq;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* @author Mahone
* @description:消費端
*
*/
public class TestConsumer extends Thread implements MessageListener{
private Connection conn = null;
private Destination destination = null ;
private Session session = null;
@Override
public void onMessage(Message message) {
try{
TextMessage tm = (TextMessage)message;
System.out.println("receive message:"+tm.getText());
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void run(){
receive();
}
public void receive(){
ConnectionFactory factory = null;
Connection conn = null ;
try{
final ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/xml/activemq.xml");
factory = (ActiveMQConnectionFactory)context.getBean("targetConnectionFactory");
conn = factory.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = (Destination)context.getBean("destination");
MessageConsumer consumer = session.createConsumer(destination);
consumer.setMessageListener(this);
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
TestConsumer mythread = new TestConsumer();
mythread.start();
}
}
Paste_Image.png
上述代碼有參考該<a >博客</a>
四、消息隊列的作用
1:解耦操作
例如說其中A更新好了之后,其他地方(B,C,D)也需要更新,那么使用消息隊列之后,A更新后,將更新通知放入消息隊列中,B,C,D中需要更新只需要訂閱這個操作就好,實現解耦。
2、實現異步操作
例如上面說的,A更新后,其他的更新都是異步進行處理,并不需要同步操作。
3、對流量進行控制
有時候訪問多了,流量就大了,忽高忽低的,如果放入隊列中,按照順序進行操作,即是先存起來,然后在按照順序進行發送。
五:浩語
__
__ _ ____ __| |__ _____ ___
\ \/ \/ / | \ | \\__ \ / _ \
\ /| | / Y \/ __ \( <_> )
\/\_/ |____/|___| (____ /\____/
\/ \/
任何事情都是要靠努力和用心。