たまには日記の一つでも。

28にしてはじめたバイオリンの記録と、ときどき日曜ハッキング

HornetQ用のJBossTSリカバリ設定

そういやHornetQ用のXAResourceRecoveryってどれだ・・・

[ore@ore hornetq-2.0.0.GA-src]$ grep -r "implements XAResourceRecovery" src/*
src/main/org/hornetq/jms/server/recovery/HornetQXAResourceRecovery.java:public class HornetQXAResourceRecovery implements XAResourceRecovery

あった。


てことはPGも合わせて、jbossts-properties.xmlはこんなもんでいいのかな

--- jbossts-properties.xml.orig 2010-04-11 20:15:12.996671300 +0900
+++ jbossts-properties.xml      2010-04-11 20:11:52.067917700 +0900
@@ -226,6 +226,11 @@
             name="com.arjuna.ats.txoj.lockstore.allowNestedLocking" value="YES"/>
     </properties>
     <properties depends="arjuna" name="jta">
+       <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.PG1"
+                  value= "com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;PostgresDS"/>
+       <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1"
+                  value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;java:/DefaultJMSProvider"/>
+        <property name="com.arjuna.ats.jta.xaRecoveryNode" value="1"/>
         <!--
         Support subtransactions in the JTA layer?
         Default is NO.


あかん。AppServerJDBCXARecoveryがJMXの認証できてない。確か以前はそもそも認証に非対応だったな・・・

20:34:45,896 ERROR [AppServerJDBCXARecovery] AppServerJDBCXARecovery.createDataSource got exception java.lang.SecurityException: Failed to authenticate principal=null, securityDomain=jmx-console
java.lang.SecurityException: Failed to authenticate principal=null, securityDomain=jmx-console
...


おおっ。AppServerJDBCXARecoveryが認証サポートしたことになっている。
[#JBTM-432] Authentication support on AppServerJDBCXARecovery plugin - JBoss Issue Tracker
https://jira.jboss.org/jira/secure/attachment/12325434/JBTM-432.patch


こうかな

    <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.PG1"
              value= "com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;jndiName=PostgresDS,username=admin,password=admin"/>


今度こそ・・・て今度はHornetQかい

2010-04-11 20:23:54,111 ERROR [org.hornetq.jms.server.recovery.HornetQXAResourceWrapper] (Thread-10) ********************************Failed to connect to server
HornetQException[errorCode=0 message=Failed to initialise session factory]
...
Caused by: java.lang.IllegalArgumentException: Error instantiating connector factory "java:/DefaultJMSProvider"
        at org.hornetq.core.client.impl.FailoverManagerImpl.instantiateConnectorFactory(FailoverManagerImpl.java:1015)
        at org.hornetq.core.client.impl.FailoverManagerImpl.<init>(FailoverManagerImpl.java:227)
        at org.hornetq.core.client.impl.ClientSessionFactoryImpl.initialise(ClientSessionFactoryImpl.java:237)
        at org.hornetq.core.client.impl.ClientSessionFactoryImpl.createSessionInternal(ClientSessionFactoryImpl.java:1039)
        ... 19 more
Caused by: java.lang.ClassNotFoundException: java:/DefaultJMSProvider from gerogerogerogero...

いやいや、クラス名じゃなくてJNDI名なんですけど・・・どうもJBMのXAResourceRecoveryとは仕様が違うらしい。


hornetq-2.0.0.GA/examples/javaee/xarecovery/server/jbossts-properties.xmlを発見!

    <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HORNETQ1"
              value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.core.remoting.impl.invm.InVMConnectorFactory"/>


したけどInVMだなぁ。リモートはどうしたらいいんだ・・・?
近くのパッケージを探しても InVMConnectorFactory と同じく ConnectorFactory を実装しているクラスが見つからない。


しょうがないので、よっこらしょ・・・てな感じでgrep

[ore@ore hornetq-2.0.0.GA-src]$ grep -r "implements ConnectorFactory" src/*
src/main/org/hornetq/core/remoting/impl/invm/InVMConnectorFactory.java:public class InVMConnectorFactory implements ConnectorFactory
src/main/org/hornetq/integration/transports/netty/NettyConnectorFactory.java:public class NettyConnectorFactory implements ConnectorFactory


いたいた。てことはこれでいいのかしら

    <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1"
              value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.integration.transports.netty.NettyConnectorFactory"/>


うむ・・・エラーは出なくなった、けど。ConnectorFactoryってのが何だかわからんな。TMとHornetQが同居しててXA切る場合はInVMConnectorFactoryが使えるようだけど、別居の場合はこれだけじゃだめだよなぁ。 NettyConnectorFactoryを指定するのはいいとして、接続先のIPとかどこで指定するんだろう・・・


とりあえずこの辺を読んでみたところ

  • org.hornetq.jms.server.recovery.HornetQXAResourceRecovery
  • org.hornetq.jms.server.recovery.HornetQXAResourceWrapper
  • org.hornetq.api.core.TransportConfiguration

HornetQXAResourceRecoveryのパラメータに ConnectorFactoryName,username,password,host=localhost,port=5445 的な書き方ができそうな気がする。


試しに、間違ったポートを指定してみよう。正しくは5445。

    <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1"
              value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.integration.transports.netty.NettyConnectorFactory,,,host=localhost,port=15445"/>


うむ。ちゃんと読まれているようだ。

22:01:50,418 WARN  [loggerI18N] [com.arjuna.ats.internal.jta.recovery.xarecovery
1] Local XARecoveryModule.xaRecovery  got XA exception javax.transaction.xa.XAEx
ception: Error trying to connect to provider org.hornetq.integration.transports.
netty.NettyConnectorFactory, XAException.XAER_RMERR
22:01:51,463 ERROR [HornetQXAResourceWrapper] ********************************Fa
iled to connect to server
HornetQException[errorCode=2 message=Unable to connect to server using configura
tion org-hornetq-integration-transports-netty-NettyConnectorFactory?port=15445&h
ost=localhost]


んではポートを5445に直して先に進むとしよう。。。結局のところ設定はこんな感じ。あー、いらんところではまった。

--- jbossts-properties.xml.orig 2010-04-11 20:15:12.996671300 +0900
+++ jbossts-properties.xml      2010-04-11 20:11:52.067917700 +0900
@@ -226,6 +226,11 @@
             name="com.arjuna.ats.txoj.lockstore.allowNestedLocking" value="YES"/>
     </properties>
     <properties depends="arjuna" name="jta">
+       <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.PG1"
+                  value= "com.arjuna.ats.internal.jbossatx.jta.AppServerJDBCXARecovery;jndiName=PostgresDS,username=admin,password=admin"/>
+       <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HQ1"
+                  value="org.hornetq.jms.server.recovery.HornetQXAResourceRecovery;org.hornetq.integration.transports.netty.NettyConnectorFactory,,,host=localhost,port=5445"/>
+        <property name="com.arjuna.ats.jta.xaRecoveryNode" value="1"/>
         <!--
         Support subtransactions in the JTA layer?
         Default is NO.

[HornetQ] JMX経由でQueueを作ったりメッセージ全消去したり

なんかあれこれやってたらうまくいった。うーん。

Queueを作る

//...(ry
import javax.management.*;
import org.hornetq.api.core.management.ObjectNameBuilder;
import org.hornetq.api.jms.management.*;
import org.jboss.mx.util.MBeanServerLocator;
//...(ry

MBeanServer server = MBeanServerLocator.locateJBoss();
ObjectName on = ObjectNameBuilder.DEFAULT.getJMSServerObjectName();
JMSServerControl serverControl =
	(JMSServerControl)
		MBeanServerInvocationHandler
			.newProxyInstance(
				server,
				on,
				JMSServerControl.class,
				false);
serverControl.createQueue("hogeQueue", "/queue/hogeQueue");

あるQueueのメッセージを全削除する

removeMessages()の引数にselectorの構文でクエリを指定すれば、一部削除もできるらしい。指定がなければ全削除の模様。

//...(ry
import javax.management.*;
import org.hornetq.api.core.management.ObjectNameBuilder;
import org.hornetq.api.jms.management.*;
import org.jboss.mx.util.MBeanServerLocator;
//...(ry

MBeanServer server = MBeanServerLocator.locateJBoss();
ObjectName on = ObjectNameBuilder.DEFAULT.getJMSQueueObjectName("hogeQueue");
JMSQueueControl queueControl = (JMSQueueControl)
	MBeanServerInvocationHandler
		.newProxyInstance(
			server,
			on,
			JMSQueueControl.class,
			false);
queueControl.removeMessages("");

JMX remoteを使ってリモートから操作するのはまだうまくいってない。SecurityException で principal=null とか言ってるから、認証情報がちゃんと渡せてないだけっぽい。そのうちやる。