You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@servicemix.apache.org by goldi <go...@freenet.de> on 2007/06/05 16:22:05 UTC
Unable to choose a flow!
Hy everybody,
I have some trouble with JMS using JCA. My configuration is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:sm="http://servicemix.apache.org/config/1.0"
xmlns:audit="http://servicemix.apache.org/audit/1.0"
xmlns:jms="http://servicemix.apache.org/jms/1.0"
xmlns:preProzessor="http://servicemix.apache.org/preProzessor"
xmlns:ro="http://servicemix.apache.org/routing"
xmlns:amq="http://activemq.org/config/1.0"
xmlns:amqra="http://activemq.org/ra/1.0">
<!-- System properties -->
<sm:systemProperties>
<property name="properties">
<map>
<entry key="java.security.auth.login.config">
<bean class="org.springframework.util.ResourceUtils"
factory-method="getFile">
<constructor-arg value="classpath:login.properties"/>
</bean>
</entry>
</map>
</property>
</sm:systemProperties>
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:servicemix.properties"/>
</bean>
<!-- Include other resources -->
<import resource="classpath:security.xml"/>
<import resource="classpath:jmx.xml"/>
<import resource="classpath:activemq.xml"/>
<import resource="classpath:tx.xml"/>
<import resource="classpath:jndi.xml"/>
<sm:container id="jbi" rootDir="./data/smx" MBeanServer="#jmxServer"
installationDirPath="./install" deploymentDirPath="./deploy"
monitorInterval="1" transactionManager="#transactionManager"
createJmxConnector="false" depends-on="jndi" persistent="true"
autoEnlistInTransaction="true" flowName="jca">
<!-- Use a secured broker (see security.xml) and define the 3 standard
flows -->
<sm:broker>
<sm:securedBroker authorizationMap="#authorizationMap">
<sm:flows>
<sm:sedaFlow/>
<sm:jmsFlow jmsURL="${activemq.url}"/>
<sm:jcaFlow connectionManager="#connectionManager"
jmsURL="${activemq.url}"/>
</sm:flows>
</sm:securedBroker>
</sm:broker>
<sm:services>
<sm:statistics statsInterval="10" dumpStats="true"/>
</sm:services>
<!--executorFactory-->
<sm:executorFactory>
<bean class="org.apache.servicemix.executors.impl.ExecutorFactoryImpl">
<property name="defaultConfig">
<bean class="org.apache.servicemix.executors.impl.ExecutorConfig">
<property name="corePoolSize" value="${servicemix.corePoolSize}"/>
<property name="maximumPoolSize"
value="${servicemix.maximumPoolSize}"/>
<property name="queueSize" value="${servicemix.queueSize}"/>
</bean>
</property>
</bean>
</sm:executorFactory>
<sm:activationSpecs>
<sm:activationSpec>
<sm:component>
<jms:component>
<jms:endpoints>
<jms:endpoint service="b:MyConsumerService" endpoint="synchronous"
targetService="preProzessor:receiver" role="consumer"
defaultMep="http://www.w3.org/2004/08/wsdl/in-only" processorName="jca"
connectionFactory="#activemqCF" resourceAdapter="#activemqRA"
bootstrapContext="#bootstrapContext" synchronous="true"
rollbackOnError="true">
<jms:activationSpec>
<amqra:activationSpec destination="queue.QueueToPreProzessor"
destinationType="javax.jms.Queue"/>
</jms:activationSpec>
</jms:endpoint>
<jms:endpoint service="b:MyConsumerService2" endpoint="async"
targetService="ro:router" role="consumer"
defaultMep="http://www.w3.org/2004/08/wsdl/in-only" processorName="jca"
connectionFactory="#activemqCF" resourceAdapter="#activemqRA"
bootstrapContext="#bootstrapContext" synchronous="true"
rollbackOnError="true">
<jms:activationSpec>
<amqra:activationSpec destination="queue.QueueToRouter"
destinationType="javax.jms.Queue"/>
</jms:activationSpec>
</jms:endpoint>
</jms:endpoints>
</jms:component>
</sm:component>
</sm:activationSpec>
</sm:activationSpecs>
</sm:container>
<sm:dotViewService container="#jbi" autoStart="false"/>
<sm:logService container="#jbi" autoStart="true" refreshPeriod="60"/>
</beans>
I always get the following exception:
2007-06-05 16:06:35,843 ERROR - JcaConsumerProcessor - Error while
handling jms message
javax.jbi.messaging.MessagingException: Unable to choose a flow for
exchange: InOnly[
id: ID:Rep-A01-3609-1181052369875-4:0
status: Active
role: provider
service: {http://servicemix.apache.org/preProzessor}receiver
endpoint: receiver
in: <?xml version="1.0" encoding="UTF-8"?><hello>World</hello>
]
at
org.apache.servicemix.jbi.nmr.DefaultBroker.sendExchangePacket(DefaultBroker.java:279)
at
org.apache.servicemix.jbi.security.SecuredBroker.sendExchangePacket(SecuredBroker.java:80)
at
org.apache.servicemix.jbi.container.JBIContainer.sendExchange(JBIContainer.java:793)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.doSend(DeliveryChannelImpl.java:381)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:456)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:428)
at
org.apache.servicemix.jms.jca.JcaConsumerProcessor.onMessage(JcaConsumerProcessor.java:117)
at org.jencks.XAEndpoint.onMessage(XAEndpoint.java:129)
at
org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessage(MessageEndpointProxy.java:121)
at
org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProxy.java:61)
at org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:696)
at
org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:165)
at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:290)
at
org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
Can someone help?
Greets Goldi
--
View this message in context: http://www.nabble.com/Unable-to-choose-a-flow%21-tf3872089s12049.html#a10970579
Sent from the ServiceMix - User mailing list archive at Nabble.com.
Re: Unable to choose a flow!
Posted by goldi <go...@freenet.de>.
I set persistence="false" on the jbi container. It was a solution to this
problem,but not a good solution for me.Because I would loose messages in
this case. And in my use-case their should no message be lost.One of one
million would be acceptable. So I now set persistence="true" and just allow
the jca-flow,this should give me the best solution to this use-case, I
think. Looking at the table at this site
http://incubator.apache.org/servicemix/transactions.html I found out that
jca-flow can just use asynchronous with persistent and not synchronous with
persistence.And in my config the jms component tries to send synchronous
while persistence is true. But if I set synchronous="false" the
jms-component does not receive any message.
bsnyder wrote:
>
> On 6/15/07, goldi <go...@freenet.de> wrote:
>>
>> Found reason for first problem. This just occurs when I'm using
>> persistence="true". Using persistence="false" I don't get the exception.
>> A
>> little bit strange I think.
>
> Where did you set persistence=false?
>
> Bruce
> --
> perl -e 'print
> unpack("u30","D0G)U8V4\@4VYY9&5R\"F)R=6-E+G-N>61E<D\!G;6%I;\"YC;VT*"
> );'
>
> Apache Geronimo - http://geronimo.apache.org/
> Apache ActiveMQ - http://activemq.org/
> Apache ServiceMix - http://servicemix.org/
> Castor - http://castor.org/
>
>
--
View this message in context: http://www.nabble.com/Unable-to-choose-a-flow%21-tf3872089s12049.html#a11163251
Sent from the ServiceMix - User mailing list archive at Nabble.com.
Re: Unable to choose a flow!
Posted by Bruce Snyder <br...@gmail.com>.
On 6/15/07, goldi <go...@freenet.de> wrote:
>
> Found reason for first problem. This just occurs when I'm using
> persistence="true". Using persistence="false" I don't get the exception. A
> little bit strange I think.
Where did you set persistence=false?
Bruce
--
perl -e 'print unpack("u30","D0G)U8V4\@4VYY9&5R\"F)R=6-E+G-N>61E<D\!G;6%I;\"YC;VT*"
);'
Apache Geronimo - http://geronimo.apache.org/
Apache ActiveMQ - http://activemq.org/
Apache ServiceMix - http://servicemix.org/
Castor - http://castor.org/
Re: Unable to choose a flow!
Posted by goldi <go...@freenet.de>.
Found reason for first problem. This just occurs when I'm using
persistence="true". Using persistence="false" I don't get the exception. A
little bit strange I think.
goldi wrote:
>
> Another problem that occurs with this component is, that the properties of
> the JMS message are lost. They seem not to be copied to the
> MessageExchange.
>
> Greets Goldi
>
> goldi wrote:
>>
>> Hy everybody,
>>
>> I have some trouble with JMS using JCA. My configuration is as follows:
>>
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <beans xmlns:sm="http://servicemix.apache.org/config/1.0"
>> xmlns:audit="http://servicemix.apache.org/audit/1.0"
>> xmlns:jms="http://servicemix.apache.org/jms/1.0"
>> xmlns:preProzessor="http://servicemix.apache.org/preProzessor"
>> xmlns:ro="http://servicemix.apache.org/routing"
>> xmlns:amq="http://activemq.org/config/1.0"
>> xmlns:amqra="http://activemq.org/ra/1.0">
>> <!-- System properties -->
>> <sm:systemProperties>
>> <property name="properties">
>> <map>
>> <entry key="java.security.auth.login.config">
>> <bean class="org.springframework.util.ResourceUtils"
>> factory-method="getFile">
>> <constructor-arg value="classpath:login.properties"/>
>> </bean>
>> </entry>
>> </map>
>> </property>
>> </sm:systemProperties>
>> <bean id="propertyConfigurer"
>> class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
>> <property name="location" value="classpath:servicemix.properties"/>
>> </bean>
>> <!-- Include other resources -->
>> <import resource="classpath:security.xml"/>
>> <import resource="classpath:jmx.xml"/>
>> <import resource="classpath:activemq.xml"/>
>> <import resource="classpath:tx.xml"/>
>> <import resource="classpath:jndi.xml"/>
>> <sm:container id="jbi" rootDir="./data/smx" MBeanServer="#jmxServer"
>> installationDirPath="./install" deploymentDirPath="./deploy"
>> monitorInterval="1" transactionManager="#transactionManager"
>> createJmxConnector="false" depends-on="jndi" persistent="true"
>> autoEnlistInTransaction="true" flowName="jca">
>> <!-- Use a secured broker (see security.xml) and define the 3 standard
>> flows -->
>> <sm:broker>
>> <sm:securedBroker authorizationMap="#authorizationMap">
>> <sm:flows>
>> <sm:sedaFlow/>
>> <sm:jmsFlow jmsURL="${activemq.url}"/>
>> <sm:jcaFlow connectionManager="#connectionManager"
>> jmsURL="${activemq.url}"/>
>> </sm:flows>
>> </sm:securedBroker>
>> </sm:broker>
>> <sm:services>
>> <sm:statistics statsInterval="10" dumpStats="true"/>
>> </sm:services>
>> <!--executorFactory-->
>> <sm:executorFactory>
>> <bean
>> class="org.apache.servicemix.executors.impl.ExecutorFactoryImpl">
>> <property name="defaultConfig">
>> <bean class="org.apache.servicemix.executors.impl.ExecutorConfig">
>> <property name="corePoolSize" value="${servicemix.corePoolSize}"/>
>> <property name="maximumPoolSize"
>> value="${servicemix.maximumPoolSize}"/>
>> <property name="queueSize" value="${servicemix.queueSize}"/>
>> </bean>
>> </property>
>> </bean>
>> </sm:executorFactory>
>> <sm:activationSpecs>
>> <sm:activationSpec>
>> <sm:component>
>> <jms:component>
>> <jms:endpoints>
>> <jms:endpoint service="b:MyConsumerService" endpoint="synchronous"
>> targetService="preProzessor:receiver" role="consumer"
>> defaultMep="http://www.w3.org/2004/08/wsdl/in-only" processorName="jca"
>> connectionFactory="#activemqCF" resourceAdapter="#activemqRA"
>> bootstrapContext="#bootstrapContext" synchronous="true"
>> rollbackOnError="true">
>> <jms:activationSpec>
>> <amqra:activationSpec destination="queue.QueueToPreProzessor"
>> destinationType="javax.jms.Queue"/>
>> </jms:activationSpec>
>> </jms:endpoint>
>> <jms:endpoint service="b:MyConsumerService2" endpoint="async"
>> targetService="ro:router" role="consumer"
>> defaultMep="http://www.w3.org/2004/08/wsdl/in-only" processorName="jca"
>> connectionFactory="#activemqCF" resourceAdapter="#activemqRA"
>> bootstrapContext="#bootstrapContext" synchronous="true"
>> rollbackOnError="true">
>> <jms:activationSpec>
>> <amqra:activationSpec destination="queue.QueueToRouter"
>> destinationType="javax.jms.Queue"/>
>> </jms:activationSpec>
>> </jms:endpoint>
>> </jms:endpoints>
>> </jms:component>
>> </sm:component>
>> </sm:activationSpec>
>> </sm:activationSpecs>
>> </sm:container>
>> <sm:dotViewService container="#jbi" autoStart="false"/>
>> <sm:logService container="#jbi" autoStart="true" refreshPeriod="60"/>
>> </beans>
>>
>>
>>
>>
>> I always get the following exception:
>>
>> 2007-06-05 16:06:35,843 ERROR - JcaConsumerProcessor - Error
>> while handling jms message
>> javax.jbi.messaging.MessagingException: Unable to choose a flow for
>> exchange: InOnly[
>> id: ID:Rep-A01-3609-1181052369875-4:0
>> status: Active
>> role: provider
>> service: {http://servicemix.apache.org/preProzessor}receiver
>> endpoint: receiver
>> in: <?xml version="1.0" encoding="UTF-8"?><hello>World</hello>
>> ]
>> at
>> org.apache.servicemix.jbi.nmr.DefaultBroker.sendExchangePacket(DefaultBroker.java:279)
>> at
>> org.apache.servicemix.jbi.security.SecuredBroker.sendExchangePacket(SecuredBroker.java:80)
>> at
>> org.apache.servicemix.jbi.container.JBIContainer.sendExchange(JBIContainer.java:793)
>> at
>> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.doSend(DeliveryChannelImpl.java:381)
>> at
>> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:456)
>> at
>> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:428)
>> at
>> org.apache.servicemix.jms.jca.JcaConsumerProcessor.onMessage(JcaConsumerProcessor.java:117)
>> at org.jencks.XAEndpoint.onMessage(XAEndpoint.java:129)
>> at
>> org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessage(MessageEndpointProxy.java:121)
>> at
>> org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProxy.java:61)
>> at
>> org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:696)
>> at
>> org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:165)
>> at
>> org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:290)
>> at
>> org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
>> at
>> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
>> at
>> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
>> at java.lang.Thread.run(Thread.java:595)
>>
>> Can someone help?
>>
>> Greets Goldi
>>
>
>
--
View this message in context: http://www.nabble.com/Unable-to-choose-a-flow%21-tf3872089s12049.html#a11135099
Sent from the ServiceMix - User mailing list archive at Nabble.com.
Re: Unable to choose a flow!
Posted by goldi <go...@freenet.de>.
Another problem that occurs with this component is, that the properties of
the JMS message are lost. They seem not to be copied to the MessageExchange.
Greets Goldi
goldi wrote:
>
> Hy everybody,
>
> I have some trouble with JMS using JCA. My configuration is as follows:
>
>
> <?xml version="1.0" encoding="UTF-8"?>
> <beans xmlns:sm="http://servicemix.apache.org/config/1.0"
> xmlns:audit="http://servicemix.apache.org/audit/1.0"
> xmlns:jms="http://servicemix.apache.org/jms/1.0"
> xmlns:preProzessor="http://servicemix.apache.org/preProzessor"
> xmlns:ro="http://servicemix.apache.org/routing"
> xmlns:amq="http://activemq.org/config/1.0"
> xmlns:amqra="http://activemq.org/ra/1.0">
> <!-- System properties -->
> <sm:systemProperties>
> <property name="properties">
> <map>
> <entry key="java.security.auth.login.config">
> <bean class="org.springframework.util.ResourceUtils"
> factory-method="getFile">
> <constructor-arg value="classpath:login.properties"/>
> </bean>
> </entry>
> </map>
> </property>
> </sm:systemProperties>
> <bean id="propertyConfigurer"
> class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
> <property name="location" value="classpath:servicemix.properties"/>
> </bean>
> <!-- Include other resources -->
> <import resource="classpath:security.xml"/>
> <import resource="classpath:jmx.xml"/>
> <import resource="classpath:activemq.xml"/>
> <import resource="classpath:tx.xml"/>
> <import resource="classpath:jndi.xml"/>
> <sm:container id="jbi" rootDir="./data/smx" MBeanServer="#jmxServer"
> installationDirPath="./install" deploymentDirPath="./deploy"
> monitorInterval="1" transactionManager="#transactionManager"
> createJmxConnector="false" depends-on="jndi" persistent="true"
> autoEnlistInTransaction="true" flowName="jca">
> <!-- Use a secured broker (see security.xml) and define the 3 standard
> flows -->
> <sm:broker>
> <sm:securedBroker authorizationMap="#authorizationMap">
> <sm:flows>
> <sm:sedaFlow/>
> <sm:jmsFlow jmsURL="${activemq.url}"/>
> <sm:jcaFlow connectionManager="#connectionManager"
> jmsURL="${activemq.url}"/>
> </sm:flows>
> </sm:securedBroker>
> </sm:broker>
> <sm:services>
> <sm:statistics statsInterval="10" dumpStats="true"/>
> </sm:services>
> <!--executorFactory-->
> <sm:executorFactory>
> <bean class="org.apache.servicemix.executors.impl.ExecutorFactoryImpl">
> <property name="defaultConfig">
> <bean class="org.apache.servicemix.executors.impl.ExecutorConfig">
> <property name="corePoolSize" value="${servicemix.corePoolSize}"/>
> <property name="maximumPoolSize"
> value="${servicemix.maximumPoolSize}"/>
> <property name="queueSize" value="${servicemix.queueSize}"/>
> </bean>
> </property>
> </bean>
> </sm:executorFactory>
> <sm:activationSpecs>
> <sm:activationSpec>
> <sm:component>
> <jms:component>
> <jms:endpoints>
> <jms:endpoint service="b:MyConsumerService" endpoint="synchronous"
> targetService="preProzessor:receiver" role="consumer"
> defaultMep="http://www.w3.org/2004/08/wsdl/in-only" processorName="jca"
> connectionFactory="#activemqCF" resourceAdapter="#activemqRA"
> bootstrapContext="#bootstrapContext" synchronous="true"
> rollbackOnError="true">
> <jms:activationSpec>
> <amqra:activationSpec destination="queue.QueueToPreProzessor"
> destinationType="javax.jms.Queue"/>
> </jms:activationSpec>
> </jms:endpoint>
> <jms:endpoint service="b:MyConsumerService2" endpoint="async"
> targetService="ro:router" role="consumer"
> defaultMep="http://www.w3.org/2004/08/wsdl/in-only" processorName="jca"
> connectionFactory="#activemqCF" resourceAdapter="#activemqRA"
> bootstrapContext="#bootstrapContext" synchronous="true"
> rollbackOnError="true">
> <jms:activationSpec>
> <amqra:activationSpec destination="queue.QueueToRouter"
> destinationType="javax.jms.Queue"/>
> </jms:activationSpec>
> </jms:endpoint>
> </jms:endpoints>
> </jms:component>
> </sm:component>
> </sm:activationSpec>
> </sm:activationSpecs>
> </sm:container>
> <sm:dotViewService container="#jbi" autoStart="false"/>
> <sm:logService container="#jbi" autoStart="true" refreshPeriod="60"/>
> </beans>
>
>
>
>
> I always get the following exception:
>
> 2007-06-05 16:06:35,843 ERROR - JcaConsumerProcessor - Error
> while handling jms message
> javax.jbi.messaging.MessagingException: Unable to choose a flow for
> exchange: InOnly[
> id: ID:Rep-A01-3609-1181052369875-4:0
> status: Active
> role: provider
> service: {http://servicemix.apache.org/preProzessor}receiver
> endpoint: receiver
> in: <?xml version="1.0" encoding="UTF-8"?><hello>World</hello>
> ]
> at
> org.apache.servicemix.jbi.nmr.DefaultBroker.sendExchangePacket(DefaultBroker.java:279)
> at
> org.apache.servicemix.jbi.security.SecuredBroker.sendExchangePacket(SecuredBroker.java:80)
> at
> org.apache.servicemix.jbi.container.JBIContainer.sendExchange(JBIContainer.java:793)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.doSend(DeliveryChannelImpl.java:381)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:456)
> at
> org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.sendSync(DeliveryChannelImpl.java:428)
> at
> org.apache.servicemix.jms.jca.JcaConsumerProcessor.onMessage(JcaConsumerProcessor.java:117)
> at org.jencks.XAEndpoint.onMessage(XAEndpoint.java:129)
> at
> org.apache.activemq.ra.MessageEndpointProxy$MessageEndpointAlive.onMessage(MessageEndpointProxy.java:121)
> at
> org.apache.activemq.ra.MessageEndpointProxy.onMessage(MessageEndpointProxy.java:61)
> at
> org.apache.activemq.ActiveMQSession.run(ActiveMQSession.java:696)
> at
> org.apache.activemq.ra.ServerSessionImpl.run(ServerSessionImpl.java:165)
> at
> org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:290)
> at
> org.apache.geronimo.connector.work.pool.NamedRunnable.run(NamedRunnable.java:32)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
> at java.lang.Thread.run(Thread.java:595)
>
> Can someone help?
>
> Greets Goldi
>
--
View this message in context: http://www.nabble.com/Unable-to-choose-a-flow%21-tf3872089s12049.html#a11014978
Sent from the ServiceMix - User mailing list archive at Nabble.com.