【Java】【Spring】【ActiveMQ】【JMX】MessageQueueの管理 | さすらいびとの徒然漂流記

さすらいびとの徒然漂流記

ふらふら漂流するさすらいびとのように,色々な話題についてお気楽極楽,徒然なるままに…

今回はActiveMQを使う場合の

MessageQueueの管理についてのメモ.


もちろん,付属のWebConsoleとか,

JDKに付属のjconsoleでチョチョイ

っていうのもありなんだけどね.



さすらいびとの徒然漂流記

さすらいびとの徒然漂流記


でも,自分のプログラムから制御したい

って時にはJMXでアクセスすればOK.


手順は以下の通り.

  1. ブローカのJMXを有効化する
  2. JVMのJMX接続ポートを有効化する
  3. JMXアクセスのクライアントとして
    JMXポートに接続する
  4. ブローカMBeanを取得する
  5. MBeanの操作を行う

まず,ActiveMQのブローカのJMXを有効にする.


設定ファイル(例えば,[ACTIVEMQ_HOME]/conf/activemq.xml)

のbrokerのuseJmxを設定する.


<broker useJmx="true" .... >


更に,managementContextのcreateConnectorを

設定する.


<mamangementContext createConnector="true" />


これで,MQのブローカの設定は完了.


次に,JMXポートの有効化には,ActvieMQの起動時に

次のシステムプロパティを設定する.


-Dcom.sun.management.jmxremote.port=1099

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false


この辺の詳細はJMXの解説を見ればOK.

この設定は認証なしなので,必要に応じて

認証ありの設定をすることも可能.


ちなみにActiveMQの起動はバッチファイルなら

"SUNJMX"変数で,サービスならwrapper.confの

"wrapper.java.additional"で設定する.



ここでやっとJMXクライアントの作成.


Clientクラス:


public class Client {

public static void main(String[] args) throws Exception {

ApplicationContext context =

new ClassPathXmlApplicationContext(

"classpath:activemq-jmx-context.xml");

ActivemqQueueManager manager =

conntext.getBean(ActivemqQueueManager.class);
BrokerViewMBean broker = manager.getBrokerMBean();

// 何か操作
}

}


ActivemqQueueManagerクラス:


@Component("queueManager")
public class ActivemqQueueManager {
@Autowired(required = true)
private MBeanServerConnection mbsConnection;

@Value("${jmx.amq.domain.name}")
private String domainName;

@Value("${jmx.amq.broker.name}")
private String brokerName;

// ブローカの取得

public BrokerViewMBean getBrokerMBean()

throws MalformedObjectNameException, NullPointerException {
Hashtable<String, String> params = new Hashtable<String, String>();
params.put("BrokerName", brokerName);
params.put("Type", "Broker");

return (BrokerViewMBean) MBeanServerInvocationHandler

.newProxyInstance(
mbsConnection,
new ObjectName(domainName, params),
BrokerViewMBean.class,
true);
}

// 名前でキューの取得
public QueueViewMBean getQueueMBean(String queueName)

throws MalformedObjectNameException, NullPointerException {
Hashtable<String, String> params = new Hashtable<String, String>();
params.put("BrokerName", brokerName);
params.put("Type", "Queue");
params.put("QueueName", queueName);
return (QueueViewMBean) MBeanServerInvocationHandler

.newProxyInstance(
mbsConnection,
new ObjectName(domainName, params),
QueueViewMBean.class,
true);
}
}


Spring Context(JMXのみ):

<bean id="jmxUrl" class="javax.management.remote.JMXServiceURL">
<constructor-arg

value="service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi"/>
</bean>

<bean id="jmxConnector"

class="javax.management.remote.JMXConnectorFactory"

factory-method="connect" >
<constructor-arg ref="jmxUrl"/>
</bean>

<bean id="mbeanServerConnection" factory-bean="jmxConnector"

factory-method="getMBeanServerConnection"/>



色々な設定自体は面倒だけど,とっても簡単だね.


ちなみにSpring ContextのJMX部分は

ホスト名とポートをプロパティで外に出せば

汎用的に使えるはず.