You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by "Andreas Veithen (JIRA)" <ji...@apache.org> on 2008/06/22 23:13:45 UTC

[jira] Commented: (SYNAPSE-369) Multiple instances of Synapse instances cannot form a shared subscription group to Sonic MQ

    [ https://issues.apache.org/jira/browse/SYNAPSE-369?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12607118#action_12607118 ] 

Andreas Veithen commented on SYNAPSE-369:
-----------------------------------------

Normally messages received through the JMS transport are already dispatched to the service by the transport listener. The exception seems to indicate that this operation failed. Indeed, if the transport doesn't predispatch the incoming message, it will be dispatched to __SynapseService by SynapseDispatcher. However, this service is only exposed on the HTTP(S) transports, explaining the exception in validateTransport.

Why would the dispatching by the JMS message listener fail?

The strategy used by the listener is as follows (see JMSMessageReceiver.Worker#run):
(1) Get the destination name (the provider name, not the JNDI name) from the JMS message.
(2) Map the JMS destination name to an Axis2 service name using JMSConnectionFactory#serviceDestinationNameMapping (which is populated during startListeningForService).
The comment "bypass dispatching if we know the service - we already should!" in JMSMessageReceiver.Worker#run as well as the code in JMSConnectionFactory#getServiceNameForDestination ("hack to get around the crazy Active MQ dynamic queue and topic issues") suggests that this strategy is not always reliable and may be the root cause of the present issue.

As far as I can see, the (destination name, service name) map used in step (2) is only required because the JMS listener uses one JMSMessageReceiver per connection factory. Since JMSMessageReceiver is registered with MessageConsumer and we have one MessageConsumer per destination/service, I wonder why we don't create a separate JMSMessageReceiver per service? In this case JMSMessageReceiver would know the service to dispatch to and no longer needs serviceDestinationNameMapping. Or am I missing something?

> Multiple instances of Synapse instances cannot form a shared subscription group to Sonic MQ
> -------------------------------------------------------------------------------------------
>
>                 Key: SYNAPSE-369
>                 URL: https://issues.apache.org/jira/browse/SYNAPSE-369
>             Project: Synapse
>          Issue Type: Bug
>          Components: Transports
>    Affects Versions: 1.1.1, 1.2
>         Environment: Windows XP, JDK 1.6, Sonic MQ 7.5.1
>            Reporter: Tanmay saha
>   Original Estimate: 1344h
>  Remaining Estimate: 1344h
>
> This is a new issue. I am running 2 instances of Synapse-1.1.1 or Synapse-1.2.  Deployed a Proxy over JMS in both instances. Goal is to make sure that when a JNDI Topic Entry is created in Sonic MQ with [[groupprefix]] in front of the actual topic (for example "[[grpsharedsubs]]TopicXA" ), at a time one Synapse instance will receive message from Sonic MQ. But Synapse throws some error. I ran a similar test by uisng a plain java jms client, which works fine in shared subscription mode. I have all the sonic required jars in Synapse\lib folder. The associated configurations are attached here 
> 1)  JNDI Lookup name in Sonic MQ
> 2) JMSTransport config in axis2.xml
> 3) Proxy config in Synapse 
> 4) JMS Transport config in Synapse 
> 5) SynapseError log. 
> JNDI Lookup in Sonic MQ
> =====================================================================
> Lookup Name=TopicXA
> Type                 =Topic
> Destination Name=[[grpsharedsubs]]TopicXA
> JMS Transport configuration in axis2.xml 
> =====================================================================
> <transportReceiver name="jms" class="org.apache.synapse.transport.jms.JMSListener"> 
>         <parameter name="myTopicConnectionFactory"> 
>         <parameter name="java.naming.factory.initial">com.sonicsw.jndi.mfcontext.MFContextFactory</parameter> 
>         <parameter name="java.naming.provider.url">tcp://localhost:2506</parameter> 
>         <parameter name="com.sonicsw.jndi.mfcontext.domain">Domain1</parameter> 
>         <parameter name="java.naming.security.principal">Administrator</parameter> 
>         <parameter name="java.naming.security.credentials">Administrator</parameter> 
>         <parameter name="transport.jms.ConnectionFactoryJNDIName">SonicTopicConnectionFactory</parameter> 
>                 <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter> 
>         </parameter> 
>         <parameter name="myQueueConnectionFactory"> 
>         <parameter name="java.naming.factory.initial">com.sonicsw.jndi.mfcontext.MFContextFactory</parameter> 
>         <parameter name="java.naming.provider.url">tcp://localhost:2506</parameter> 
>                 <parameter name="com.sonicsw.jndi.mfcontext.domain">Domain1</parameter> 
>         <parameter name="java.naming.security.principal">Administrator</parameter> 
>         <parameter name="java.naming.security.credentials">Administrator</parameter>         
>         <parameter name="transport.jms.ConnectionFactoryJNDIName">SonicQueueConnectionFactory</parameter> 
>                 <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter> 
>         </parameter> 
>     </transportReceiver>     
>     
>     <transportSender name="jms" class="org.apache.synapse.transport.jms.JMSSender"/> 
> Proxy Service Configuration
> ===================================
>  <!--  Introduction to proxy services 
>   --> 
> - <definitions xmlns="http://ws.apache.org/ns/synapse">
> - <!--  define the request processing XSLT resource as a static URL source 
>   --> 
>   <localEntry key="xslt-key-req" src="file:repository/conf/sample/resources/transform/echo_transform.xslt" /> 
> - <proxy name="echoProxy" transports="jms">
> - <target>
> - <endpoint>
>   <address uri="http://localhost:8082/EJBWebService/EchoBean" /> 
>   </endpoint>
> - <outSequence>
>   <log level="full" /> 
> - <out>
>   <xslt key="xslt-key-req" /> 
>   </out>
>   <send /> 
>   </outSequence>
>   </target>
>   <parameter name="transport.jms.ConnectionFactory">myTopicConnectionFactory</parameter> 
>   <parameter name="transport.jms.Destination">TopicXA</parameter> 
>   <parameter name="transport.jms.DestinationType">topic</parameter> 
>   <parameter name="transport.jms.ReplyDestination">ReplyTopic</parameter> 
>   <parameter name="transport.jms.ReplyDestinationType">topic</parameter> 
>   <publishWSDL uri="file:repository/conf/sample/resources/proxy/echo_proxy.wsdl" /> 
>   </proxy>
>   </definitions>
> Synapse Error Log
> ================================================================================
> 2008-06-17 13:06:23,933 [10.200.182.100-PS-TSAHA] [WrapperSimpleAppMain]  INFO ServerManager Ready for processing 
> 2008-06-17 13:22:49,794 [10.200.182.100-PS-TSAHA] [JMS Session Delivery Thread] DEBUG JMSMessageReceiver Received JMS message to destination : TopicXA 
> Message ID : ID:ffffffffcbed081a:2c060009:11A9831ACB2 
> Correlation ID : null 
> ReplyTo ID : null 
> 2008-06-17 13:22:49,810 [10.200.182.100-PS-TSAHA] [jms-Worker-1] DEBUG JMSListener Error receiving message 
> org.apache.axis2.AxisFault: The service cannot be found for the endpoint reference (EPR) 
>         at org.apache.axis2.engine.DispatchPhase.validateTransport(DispatchPhase.java:216) 
>         at org.apache.axis2.engine.DispatchPhase.checkPostConditions(DispatchPhase.java:93) 
>         at org.apache.axis2.engine.Phase.invoke(Phase.java:308) 
>         at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:212) 
>         at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:132) 
>         at org.apache.synapse.transport.base.AbstractTransportListener.handleIncomingMessage(AbstractTransportListener.java:210) 
>         at org.apache.synapse.transport.jms.JMSMessageReceiver$Worker.run(JMSMessageReceiver.java:201) 
>         at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
>         at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
>         at java.lang.Thread.run(Unknown Source)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@synapse.apache.org
For additional commands, e-mail: dev-help@synapse.apache.org