1. ActiveMQ 소개
자바로 개발된 오픈 소스 메시지 브로커이다.
2. 다운로드 및 설치
2.1. 다운로드
http://activemq.apache.org/activemq-5152-release.html
2018년 2월 1일 기준 5.15.2를 설치한다. (직접 다운로드 링크:
http://ftp.meisei-u.ac.jp/mirror/apache/dist//activemq/5.15.2/apache-activemq-5.15.2-bin.tar.gz)
2.2. 설치
- 5.10.0 이하는 Java 1.6 가능
- 그 이상은 Java 1.7 필요
3. 기동
3.1. 백그라운드 실행
$ ./activemq start INFO: Loading '/sw/apache-activemq-5.15.2//bin/env' INFO: Using java '/sw/jdk-9.0.4/bin/java' INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details INFO: pidfile created : '/sw/apache-activemq-5.15.2//data/activemq.pid' (pid '3255')
3.2. 포그라운드 실행
$ ./activemq console INFO: Loading '/sw/apache-activemq-5.15.2//bin/env' INFO: Using java '/sw/jdk-9.0.4/bin/java' INFO: Starting in foreground, this is just for debugging purposes (stop process by pressing CTRL+C) INFO: Creating pidfile /sw/apache-activemq-5.15.2//data/activemq.pid Java Runtime: Oracle Corporation 9.0.4 /sw/jdk-9.0.4 Heap sizes: current=63360k free=56367k max=1013632k JVM args: -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/sw/apache-activemq-5.15.2//conf/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/sw/apache-activemq-5.15.2//tmp -Dactivemq.classpath=/sw/apache-activemq-5.15.2//conf:/sw/apache-activemq-5.15.2//../lib/: -Dactivemq.home=/sw/apache-activemq-5.15.2/ -Dactivemq.base=/sw/apache-activemq-5.15.2/ -Dactivemq.conf=/sw/apache-activemq-5.15.2//conf -Dactivemq.data=/sw/apache-activemq-5.15.2//data Extensions classpath: [/sw/apache-activemq-5.15.2/lib,/sw/apache-activemq-5.15.2/lib/camel,/sw/apache-activemq-5.15.2/lib/optional,/sw/apache-activemq-5.15.2/lib/web,/sw/apache-activemq-5.15.2/lib/extra] ACTIVEMQ_HOME: /sw/apache-activemq-5.15.2 ACTIVEMQ_BASE: /sw/apache-activemq-5.15.2 ACTIVEMQ_CONF: /sw/apache-activemq-5.15.2/conf ACTIVEMQ_DATA: /sw/apache-activemq-5.15.2/data Loading message broker from: xbean:activemq.xml
3.3. 프로세스
mquser 4178 4177 20 07:34 pts/0 00:00:04 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.151-1.b12.35.amzn1.x86_64/jre/bin/java -Xms1024M -Xmx1024M -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login.config=/sw/apache-activemq-5.15.2//conf/login.config -Dcom.sun.management.jmxremote -Djava.awt.headless=true -Djava.io.tmpdir=/sw/apache-activemq-5.15.2//tmp -Dactivemq.classpath=/sw/apache-activemq-5.15.2//conf:/sw/apache-activemq-5.15.2//../lib/: -Dactivemq.home=/sw/apache-activemq-5.15.2/ -Dactivemq.base=/sw/apache-activemq-5.15.2/ -Dactivemq.conf=/sw/apache-activemq-5.15.2//conf -Dactivemq.data=/sw/apache-activemq-5.15.2//data -jar /sw/apache-activemq-5.15.2//bin/activemq.jar start
4. 콘솔
- 콘솔 포트는 8161번이다.
- 기본 사용자는 admin/admin이다.
5. 오류
5.1. Java 버전
$ ./activemq console INFO: Loading '/sw/apache-activemq-5.15.2//bin/env' INFO: Using java '/usr/lib/jvm/jre/bin/java' INFO: Starting in foreground, this is just for debugging purposes (stop process by pressing CTRL+C) INFO: Creating pidfile /sw/apache-activemq-5.15.2//data/activemq.pid Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/activemq/console/Main : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:803) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:442) at java.net.URLClassLoader.access$100(URLClassLoader.java:64) at java.net.URLClassLoader$1.run(URLClassLoader.java:354) at java.net.URLClassLoader$1.run(URLClassLoader.java:348) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:347) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:312) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
5.2. hostname
WARN | Failed to get host name: java.net.UnknownHostException: ip-10-0-10-132: ip-10-0-10-132: Name or service not known java.net.UnknownHostException: ip-10-0-10-132: ip-10-0-10-132: Name or service not known at java.base/java.net.InetAddress.getLocalHost(InetAddress.java:1631)[:] at io.fabric8.insight.log.support.LogQuerySupport.(LogQuerySupport.java:55)[insight-log-core-1.2.0.Beta4.jar:1.2.0.Beta4] at io.fabric8.insight.log.log4j.Log4jLogQuery.(Log4jLogQuery.java:72)[insight-log4j-1.2.0.Beta4.jar:1.2.0.Beta4] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)[:] at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)[:] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)[:] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:488)[:] at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)[spring-beans-4.3.9.RELEASE.jar:4.3.9.RELEASE]
hostname에 나오는 호스트 명을 /etc/hosts에도 넣어줘야 한다.
6. 클라이언트 단
6.1. Maven 설정
<dependencies> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-client</artifactId> <version>5.15.0</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-pool</artifactId> <version>5.15.0</version> </dependency> <dependencies>
6.2. 오류
6.2.1. Connection Timeout
Caused by: javax.jms.JMSException: Could not connect to broker URL: tcp://10.230.32.161:61616. Reason: java.net.ConnectException: Connection timed out: connect at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:36) at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:374) at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:304) at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:244) at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:275) at org.apache.activemq.jms.pool.PooledConnectionFactory$1.makeObject(PooledConnectionFactory.java:95) at org.apache.activemq.jms.pool.PooledConnectionFactory$1.makeObject(PooledConnectionFactory.java:92) at org.apache.commons.pool2.impl.GenericKeyedObjectPool.create(GenericKeyedObjectPool.java:1041) at org.apache.commons.pool2.impl.GenericKeyedObjectPool.addObject(GenericKeyedObjectPool.java:1221) at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:221) ... 2 more
stack을 떠보면 다음과 같다.
java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) - locked (a java.net.SocksSocketImpl) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at org.apache.activemq.transport.tcp.TcpTransport.connect(TcpTransport.java:525) at org.apache.activemq.transport.tcp.TcpTransport.doStart(TcpTransport.java:488) at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55) at org.apache.activemq.transport.AbstractInactivityMonitor.start(AbstractInactivityMonitor.java:169) at org.apache.activemq.transport.InactivityMonitor.start(InactivityMonitor.java:52) at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:64) at org.apache.activemq.transport.WireFormatNegotiator.start(WireFormatNegotiator.java:72) at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:64) at org.apache.activemq.transport.TransportFilter.start(TransportFilter.java:64) at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:354) at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:304) at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:244) at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:275) at org.apache.activemq.jms.pool.PooledConnectionFactory$1.makeObject(PooledConnectionFactory.java:95) at org.apache.activemq.jms.pool.PooledConnectionFactory$1.makeObject(PooledConnectionFactory.java:92) at org.apache.commons.pool2.impl.GenericKeyedObjectPool.create(GenericKeyedObjectPool.java:1041) at org.apache.commons.pool2.impl.GenericKeyedObjectPool.addObject(GenericKeyedObjectPool.java:1221) at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:221) - locked (a org.apache.activemq.jms.pool.PooledConnectionFactory) at org.apache.activemq.jms.pool.PooledConnectionFactory.createConnection(PooledConnectionFactory.java:204) at io.sarc.App.main(App.java:53) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
netstat를 확인해 보자.
tcp 0 1 ::ffff:10.0.10.100:40666 ::ffff:192.168.3.20:61616 SYN_SENT
6.2.2. Cannot send
Caused by: org.apache.activemq.transport.InactivityIOException: Cannot send, channel has already failed: tcp://10.230.32.161:5672 at org.apache.activemq.transport.AbstractInactivityMonitor.doOnewaySend(AbstractInactivityMonitor.java:328) at org.apache.activemq.transport.AbstractInactivityMonitor.oneway(AbstractInactivityMonitor.java:317) at org.apache.activemq.transport.TransportFilter.oneway(TransportFilter.java:94) at org.apache.activemq.transport.WireFormatNegotiator.oneway(WireFormatNegotiator.java:116) at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68) at org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java:81) at org.apache.activemq.transport.ResponseCorrelator.request(ResponseCorrelator.java:86) at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1388) ... 5 more