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
