Announcement Announcement Module
Collapse
No announcement yet.
No subscriber for message-driven-channel-adapter with container and jndi Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • No subscriber for message-driven-channel-adapter with container and jndi

    Hello all,
    I am having a problem with the message-drivern-channel-adapter. I am sending messages to it and I getting an exception for Dispatcher has no subscribers.

    Here's the full Exception:
    Code:
    SEVERE: org.springframework.integration.MessageDeliveryException: Dispatcher has no subscribers.
    	at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:108)
    	at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:101)
    	at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:61)
    	at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
    	at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128)
    	at org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)
    	at org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)
    	at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.sendMessage(AbstractReplyProducingMessageHandler.java:175)
    	at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.sendReplyMessage(AbstractReplyProducingMessageHandler.java:159)
    	at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.produceReply(AbstractReplyProducingMessageHandler.java:124)
    	at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleResult(AbstractReplyProducingMessageHandler.java:118)
    	at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:100)
    	at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:73)
    	at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:114)
    	at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:101)
    	at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:61)
    	at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)
    	at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128)
    	at org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)
    	at org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)
    	at org.springframework.integration.endpoint.SourcePollingChannelAdapter.doPoll(SourcePollingChannelAdapter.java:97)
    	at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:146)
    	at org.springframework.integration.endpoint.AbstractPollingEndpoint$1.call(AbstractPollingEndpoint.java:144)
    	at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller$1.run(AbstractPollingEndpoint.java:207)
    	at org.springframework.integration.util.ErrorHandlingTaskExecutor$1.run(ErrorHandlingTaskExecutor.java:52)
    	at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:48)
    	at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:49)
    	at org.springframework.integration.endpoint.AbstractPollingEndpoint$Poller.run(AbstractPollingEndpoint.java:202)
    	at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:51)
    	at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)
    	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
    	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
    	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:98)
    	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:206)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    	at java.lang.Thread.run(Thread.java:662)
    I tried to reproduce it with minimal configuration and without using neither transaction nor my MQ JMS channels and came up with the below minimal spring configuration which reads of a directory and publish messages to the JMS queue (in this simple case I use ActiveMQ). I am using jndi to configure the jmsContainer and set it on the message-driven-channel-adapter. Please see the spring.xml and the jndi.properties file.

    spring.xml
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:si="http://www.springframework.org/schema/integration"
           xmlns:jms="http://www.springframework.org/schema/integration/jms"
           xmlns:file="http://www.springframework.org/schema/integration/file"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                               http://www.springframework.org/schema/context
                               http://www.springframework.org/schema/context/spring-context-3.0.xsd
                               http://www.springframework.org/schema/integration
                               http://www.springframework.org/schema/integration/spring-integration-2.1.xsd
                               http://www.springframework.org/schema/integration/jms
                               http://www.springframework.org/schema/integration/jms/spring-integration-jms-2.1.xsd
                               http://www.springframework.org/schema/integration/file
                               http://www.springframework.org/schema/integration/file/spring-integration-file-2.1.xsd">
    
      <context:property-placeholder location="classpath*:jndi.properties"/>
      <file:inbound-channel-adapter directory="C:\tools\dump" channel="fileInChannel">
        <si:poller id="poller" fixed-delay="5000"/>
      </file:inbound-channel-adapter>
      <si:channel id="fileInChannel"/>
      <file:file-to-string-transformer input-channel="fileInChannel" output-channel="jmsOut"/>
      <si:channel id="jmsOut"/>
      <jms:message-driven-channel-adapter channel="jmsOut" container="jmsContainer"/>
      <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="queueConnectionFactory"/>
        <property name="destination" ref="outputQueue"/>
      </bean>
      <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
          <props>
            <prop key="java.naming.factory.initial">${java.naming.factory.initial}</prop>
            <prop key="java.naming.provider.url">${java.naming.provider.url}</prop>
          </props>
        </property>
      </bean>
      <bean id="queueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplate"/>
        <property name="jndiName" value="${queueConnection.factory}"/>
      </bean>
      <bean id="outputQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplate"/>
        <property name="jndiName" value="${queue.datastore}"/>
      </bean>
    </beans>
    jndi.properties
    Code:
    # ActiveMQ properties
    java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616
    jndi.factory=org.apache.activemq.jndi.ActiveMQInitialContextFactory
    jndi.provider=tcp://localhost:61616
    queueConnection.factory=QueueConnectionFactory
    queue.datastore=DatastoreRequest
    queue.DatastoreRequest=DatastoreRequest
    The version of the libraries I am using can be found on the pom.xml file:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>test</groupId>
      <artifactId>test</artifactId>
      <version>1.0</version>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.version>3.0.7.RELEASE</spring.version>
        <spring-integration.version>2.1.0.RELEASE</spring-integration.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.integration</groupId>
          <artifactId>spring-integration-jms</artifactId>
          <version>${spring-integration.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework.integration</groupId>
          <artifactId>spring-integration-file</artifactId>
          <version>${spring-integration.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.apache.activemq</groupId>
          <artifactId>activemq-core</artifactId>
          <version>5.6.0</version>
        </dependency>
        <dependency>
          <groupId>javax.jms</groupId>
          <artifactId>jms</artifactId>
          <version>1.1</version>
        </dependency>
      </dependencies>
    </project>

  • #2
    I want to use message-driven-channel-adapter for using transaction and drive the JMS queues from JNDI on my MQ.

    Is it a bug or a misconfiguration?

    PS: Sorry for double post, I exceeded the post limit of 10k chars.

    Thanks in advance for any feedback

    Comment


    • #3
      The message-driven adapter is an INBOUND adapter; you need to use an outbound adapter if you want to WRITE the file contents to the queue.

      Currently you have 2 inbound adapters sending to jmsOut which has no subscribers.

      By the way, you should update to a more recent release (current release is 2.1.3), which includes the channel name in the 'Dispatcher has no subscribers' message.

      Comment


      • #4
        OK since the message-driven adapter is INBOUND I want something similar for outbound.
        So I will use Outbound Channel Adapter (http://static.springsource.org/sprin...hannel-adapter) but how would I achieve transaction on that component? A database update should only be commited if and only if the message was published successfully on the JMS Queue (MQ backend).

        Is there another component I am missing?

        Comment


        • #5
          I don't see any database activity in your flow; I see only a file adapter and an jms adapter.

          To run the flow in a JMS transaction, add a <transactional/> element to the poller on the file adapter.

          Comment

          Working...
          X