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