HornetQ standalone with TomEE...
emanuele.villa Aug 21, 2013 6:29 AMHi,
we're trying to connect, using hornetq-ra-rar "build example", from our application deployed into a TomEE+ to a standalone HornetQ 2.3.0 but with no successful results... Is there anyone who had tried a similar integration successfully? We'll appreciate very much a support in this way!
We have downloaded and started a HornetQ (2.3.0-Final) standalone instance with no change to configuration files (we're using the default provided configuration); we have done the following changes in our TomEE instance (following the official JBoss and TomEE documentation plus the following post: http://lucamerolla.wordpress.com/2011/06/10/openejb-and-hornetq/):
1 - In hornetq-ra-rar example project (downloaded from the official jboss hornetq web-site) we create a file called service-jar.xml under the path hornetq-ra-rar/src/main/resources/ord/hornetq/ra/ with the following content:
<?xml version="1.0" encoding="UTF-8"?>
<ServiceJar>
<ServiceProvider
id="HornetQ MDB Container"
service="Container"
types="MESSAGE"
constructor="id, securityService, ResourceAdapter, MessageListenerInterface, ActivationSpecClass, InstanceLimit"
class-name="org.apache.openejb.core.mdb.MdbContainer">
ResourceAdapter HornetQ JMS Resource Adapter
MessageListenerInterface javax.jms.MessageListener
ActivationSpecClass org.hornetq.ra.inflow.HornetQActivationSpec
InstanceLimit 10
</ServiceProvider>
<ServiceProvider
id="HornetQ JMS Resource Adapter"
service="Resource"
types="HornetQResourceAdapter"
class-name="org.hornetq.ra.HornetQResourceAdapter">
DataSource Default Unmanaged JDBC Database
</ServiceProvider>
<ServiceProvider
id="HornetQ JMS Connection Factory"
service="Resource"
types="javax.jms.ConnectionFactory, javax.jms.QueueConnectionFactory, javax.jms.TopicConnectionFactory, QueueConnectionFactory, TopicConnectionFactory"
class-name="org.hornetq.ra.HornetQRAManagedConnectionFactory">
ResourceAdapter HornetQ JMS Resource Adapter
TransactionSupport xa
PoolMaxSize 10
PoolMinSize 0
ConnectionMaxWaitMilliseconds 5000
ConnectionMaxIdleMinutes 15
</ServiceProvider>
<ServiceProvider
id="Default Queue"
service="Resource"
types="javax.jms.Queue, Queue"
constructor="destination"
class-name="org.hornetq.jms.client.HornetQQueue">
</ServiceProvider>
<ServiceProvider
id="Default Topic"
service="Resource"
types="javax.jms.Topic, Topic"
constructor="destination"
class-name="org.hornetq.jms.client.HornetQTopic">
</ServiceProvider>
</ServiceJar>
2 - In hornetq-ra-rar example project (the same of previous point) we changed the content of the file ra.xml as below:
<?xml version="1.0" encoding="UTF-8"?>
<connector xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd"
version="1.5">
<description>HornetQ 2.0 Resource Adapter</description>
<display-name>HornetQ 2.0 Resource Adapter</display-name>
<vendor-name>Red Hat Middleware LLC</vendor-name>
<eis-type>JMS 1.1 Server</eis-type>
<resourceadapter-version>1.0</resourceadapter-version>
<license>
<description>
Copyright 2009 Red Hat, Inc.
Red Hat licenses this file to you under the Apache License, version
2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.
</description>
<license-required>true</license-required>
</license>
<resourceadapter>
<resourceadapter-class>org.hornetq.ra.HornetQResourceAdapter</resourceadapter-class>
<config-property>
<description>
The transport type. Multiple connectors can be configured by using a comma separated list,
i.e. org.hornetq.core.remoting.impl.invm.InVMConnectorFactory,org.hornetq.core.remoting.impl.invm.InVMConnectorFactory.
</description>
<config-property-name>ConnectorClassName</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</config-property-value>
</config-property>
<config-property>
<description>The transport configuration. These values must be in the form of key=val;key=val;,
if multiple connectors are used then each set must be separated by a comma i.e. host=host1;port=5445,host=host2;port=5446.
Each set of params maps to the connector classname specified.
</description>
<config-property-name>ConnectionParameters</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>host=127.0.0.1;port=5445</config-property-value>
</config-property>
<outbound-resourceadapter>
<connection-definition>
<managedconnectionfactory-class>org.hornetq.ra.HornetQRAManagedConnectionFactory</managedconnectionfactory-class>
<config-property>
<description>The default session type</description>
<config-property-name>SessionDefaultType</config-property-name>
<config-property-type>java.lang.String</config-property-type>
<config-property-value>javax.jms.Queue</config-property-value>
</config-property>
<config-property>
<description>Try to obtain a lock within specified number of seconds; less than or equal to 0 disable this functionality</description>
<config-property-name>UseTryLock</config-property-name>
<config-property-type>java.lang.Integer</config-property-type>
<config-property-value>0</config-property-value>
</config-property>
<connectionfactory-interface>org.hornetq.ra.HornetQRAConnectionFactory</connectionfactory-interface>
<connectionfactory-impl-class>org.hornetq.ra.HornetQRAConnectionFactoryImpl</connectionfactory-impl-class>
<connection-interface>javax.jms.Session</connection-interface>
<connection-impl-class>org.hornetq.ra.HornetQRASession</connection-impl-class>
</connection-definition>
<transaction-support>XATransaction</transaction-support>
<authentication-mechanism>
<authentication-mechanism-type>BasicPassword</authentication-mechanism-type>
<credential-interface>javax.resource.spi.security.PasswordCredential</credential-interface>
</authentication-mechanism>
<reauthentication-support>false</reauthentication-support>
</outbound-resourceadapter>
<inbound-resourceadapter>
<messageadapter>
<messagelistener>
<messagelistener-type>javax.jms.MessageListener</messagelistener-type>
<activationspec>
<activationspec-class>org.hornetq.ra.inflow.HornetQActivationSpec</activationspec-class>
<required-config-property>
<config-property-name>destination</config-property-name>
</required-config-property>
</activationspec>
</messagelistener>
</messageadapter>
</inbound-resourceadapter>
</resourceadapter>
</connector>
3 - we build with maven hornetq-ra-rar project (it includes the previous two files service-jar.xml and ra.xml) and we put the generated hornetq-rar-2.3.0.Final-sources.jar under TomEE lib folder with the following hornetq jars list:
hornetq-commons-2.3.0.Final.jar
hornetq-core-client-2.3.0.Final.jar
hornetq-jms-client-2.3.0.Final.jar
hornetq-jms-server-2.3.0.Final.jar
hornetq-journal-2.3.0.Final.jar
hornetq-ra-2.3.0.Final.jar
hornetq-rar-2.3.0.Final-sources.jar
hornetq-server-2.3.0.Final.jar
jboss-common-core-2.2.14.GA.jar
jboss-connector-api_1.5_spec-1.0.0.Final.jar
jboss-jms-api_1.1_spec-1.0.0.Final.jar
jbossjts-4.16.4.Final.jar
jboss-logging-3.1.0.GA.jar
jboss-logmanager-1.2.2.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jboss-transaction-spi-7.0.0.Final.jar
jgroups-3.2.5.Final.jar
jnpserver-5.0.3.GA.jar
netty-3.6.2.Final.jarhornetq-commons-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-core-client-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-jms-client-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-jms-server-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-journal-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-ra-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-rar-2.3.0.Final-sources.jar
/home/evilla/data/products/tomEE/hornetqlib/hornetq-server-2.3.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-common-core-2.2.14.GA.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-connector-api_1.5_spec-1.0.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-jms-api_1.1_spec-1.0.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jbossjts-4.16.4.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-logging-3.1.0.GA.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-logmanager-1.2.2.GA.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-transaction-api_1.1_spec-1.0.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jboss-transaction-spi-7.0.0.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jgroups-3.2.5.Final.jar
/home/evilla/data/products/tomEE/hornetqlib/jnpserver-5.0.3.GA.jar
/home/evilla/data/products/tomEE/hornetqlib/netty-3.6.2.Final.jar
4 - We changed our tomee.xml in this way:
<?xml version="1.0" encoding="UTF-8"?>
<tomee>
<Container id="SmsJmsMdbContainer" type="MESSAGE" provider="org.hornetq.ra#HornetQ MDB Container">
ResourceAdapter SmsJmsResourceAdapter
MessageListenerInterface javax.jms.MessageListener
ActivationSpecClass org.hornetq.ra.inflow.HornetQActivationSpec
InstanceLimit 10
</Container>
<Resource id="SmsJmsResourceAdapter" type="HornetQResourceAdapter" provider="org.hornetq.ra#HornetQ JMS Resource Adapter">
DiscoveryAddress 127.0.0.1
DiscoveryPort 5445
</Resource>
<Resource id="SmsQueue" provider="org.hornetq.ra#Default Queue">
</Resource>
<Connector id="SmsJmsConnectionFactory" type="javax.jms.ConnectionFactory" provider="org.hornetq.ra#HornetQ JMS Connection Factory">
ResourceAdapter SmsJmsResourceAdapter
TransactionSupport xa
PoolMaxSize 10
PoolMinSize 0
ConnectionMaxWaitMilliseconds 5000
ConnectionMaxIdleMinutes 15
</Connector>
</tomee>
RESULT:
When we start the application server, we have the following error:
INFO: HQ151001: Attempting to reconnect org.hornetq.ra.inflow.HornetQActivationSpec(ra=org.hornetq.ra.HornetQResourceAdapter@5ab3f4a1 destination=SmsQueue destinationType=javax.jms.Queue ack=Auto-acknowledge durable=false clientID=null user=null maxSession=15)
Aug 21, 2013 10:11:32 AM org.hornetq.ra.inflow.HornetQActivation handleFailure
ERROR: HQ154003: Unable to reconnect org.hornetq.ra.inflow.HornetQActivationSpec(ra=org.hornetq.ra.HornetQResourceAdapter@5ab3f4a1 destination=SmsQueue destinationType=javax.jms.Queue ack=Auto-acknowledge durable=false clientID=null user=null maxSession=15)
HornetQException[errorType=INTERNAL_ERROR message=HQ119004: Failed to initialise session factory]
at org.hornetq.core.client.impl.ServerLocatorImpl.initialise(ServerLocatorImpl.java:393)
at org.hornetq.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:776)
at org.hornetq.ra.inflow.HornetQActivation.setup(HornetQActivation.java:312)
at org.hornetq.ra.inflow.HornetQActivation.handleFailure(HornetQActivation.java:651)
at org.hornetq.ra.inflow.HornetQActivation$SetupActivation.run(HornetQActivation.java:706)
at org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:366)
at org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.net.SocketException: Not a multicast address
at java.net.MulticastSocket.joinGroup(MulticastSocket.java:306)
at org.hornetq.api.core.UDPBroadcastGroupConfiguration$UDPBroadcastEndpoint.openClient(UDPBroadcastGroupConfiguration.java:215)
at org.hornetq.core.cluster.DiscoveryGroup.start(DiscoveryGroup.java:108)
at org.hornetq.core.client.impl.ServerLocatorImpl.initialise(ServerLocatorImpl.java:387)
... 9 more
It seems an error due to the DeliveryAddress specified in tomee.xml during SmsJmsResourceAdapter resource definition... Is there a way to specify an unicast address? I mean an addresss like 127.0.0.1 where we install our standalone HornetQ instance... Or is there a way to use another ResourceAdapter? Or we are wrong with something else?
Thank you to anyone who could reply!
Best regards,
Emanuele.