消息不会被消耗,具体取决于消息是文本类型还是字符串

时间:2016-02-27 11:46:07

标签: spring-integration

下面我有程序发送消息并从队列中消耗消息,现在我已经注释掉了发送部分并且只想消耗来自队列的消息,消息可以是字符串或对象消息的类型我有配置路由器。

现在队列中有一条文本消息,我的下面的程序没有消耗,请告知如何克服下面这个是我的配置,因为你可以看到我已经注释掉发件人部分所以队列中唯一的阅读部分是活跃的

并且当rite现在我已经观察到消息被消耗但文件没有被生成因此这意味着在配置有效负载路由器之后有一些错误          

    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
    http://www.springframework.org/schema/integration/jms 
    http://www.springframework.org/schema/integration/jms/spring-integration-jms.xsd 
    http://www.springframework.org/schema/integration/spring-integration.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/integration/file
    http://www.springframework.org/schema/integration/file/spring-integration-file.xsd    
    http://www.springframework.org/schema/context/spring-context.xsd">


    <int:poller id="poller" default="true">
        <int:interval-trigger interval="200" />
    </int:poller>



    <int:channel id="input">
        <int:queue capacity="10" />
    </int:channel>

    <bean id="tibcoEMSJndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">com.tibco.tibjms.naming.TibjmsInitialContextFactory
                </prop>
                <prop key="java.naming.provider.url">tcp://lsdrtems2.fm.crdgrp.net:7333</prop>
                <prop key="java.naming.security.principal">acfgtir</prop>
                <prop key="java.naming.security.credentials">acfgtir</prop>
            </props>
        </property>
    </bean>

    <bean id="tibcoEMSConnFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate">
            <ref bean="tibcoEMSJndiTemplate" />
        </property>
        <property name="jndiName">
            <value>GenericConnectionFactory</value>
        </property>
    </bean>

    <bean id="tibcosendJMSTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory">
            <ref bean="tibcoEMSConnFactory" />
        </property>
        <property name="defaultDestinationName">
            <value>acfgtirrtyation.ioa.swretift_publish_poc1</value>
        </property>
        <property name="pubSubDomain">
            <value>false</value>
        </property>
        <property name="receiveTimeout">
            <value>120000</value>
        </property>
    </bean>




    <!-- <jms:outbound-channel-adapter channel="input" 
        destination-name="acfgtirrtyation.ioa.swretift_publish_poc1" connection-factory="tibcoEMSConnFactory" /> -->

<int:channel id="objetChannel"></int:channel>
<int:channel id="StringChannel"></int:channel>
<int:channel id="jmsInChannel" />



<jms:message-driven-channel-adapter id="jmsIn" concurrent-consumers="10"
        destination-name="acfgtirrtyation.ioa.swretift_publish_poc1"  connection-factory="tibcoEMSConnFactory" extract-payload="false"
        channel="jmsInChannel" />

    <int:payload-type-router input-channel="jmsInChannel">
    <int:mapping type="javax.jms.ObjectMessage" channel="objetChannel" />
     <int:mapping type="javax.jms.TextMessage" channel="StringChannel" />
    </int:payload-type-router>



 <file:outbound-channel-adapter id="filesoutOject"  channel="objetChannel" directory="C:\\abcsaral"
 filename-generator="generatorr" />



 <file:outbound-channel-adapter id="filesoutString"  channel="StringChannel" directory="C:\\abcsaral"
 filename-generator="generatorr" />

<bean id="generatorr" class="com.abs.tibco.TimestampTextGenerator">
    </bean>


</beans>

请各位建议任何早期帮助将非常感谢

下面是时间戳生成器类,如下所示

public class TimestampTextGenerator implements FileNameGenerator {



    @Override
    public String generateFileName(Message<?> arg0) {
        return new java.text.SimpleDateFormat("yyyyMMdd-HHmmss.SSS")
        .format(new java.util.Date()) + ".txt";
    }

}

请各位建议,因为我完全坚持了这个......!

2 个答案:

答案 0 :(得分:0)

extract-payload="false"中删除此属性message-driven-channel-adapter。它会更改预期的有效负载类型,而您的payload-type-router不起作用。

另请参阅此20.1. Inbound Channel Adapter手册章节。

答案 1 :(得分:0)

了解应用程序错误的最佳方法是查看日志。我应该承认,有时候Java比我更聪明: - )。

请参阅Gary Russel关于此事的答案:Enabling logging in spring integration utiliy

请尽量按照我们对此主题的所有答案进行跟进。

我建议您使用extract-payload="false"将整个javax.jms.ObjectMessagejavax.jms.TextMessage作为payload,与转化结果无关,而javax.jms.ObjectMessage可能会被转换也是java.lang.String。虽然,在大多数情况下,仅基于java.lang.String和所有其他路由的路由也应该有效。

现在关于<file:outbound-channel-adapter>问题。如果您进入日志,您应该看到类似的内容:

else {
    throw new IllegalArgumentException(
                "unsupported Message payload type [" + payload.getClass().getName() + "]");
}

M-m-m,是的,我的意思是日志中此异常的结果。仅仅因为payloadjavax.jms.Message,但要写入文件,您应该提供FileInputStreambyte[]String

因此,正如我在对您的类似问题的回答(consuming all the object type messages from a queue)的评论中所说的那样,您应该在路由到<file:outbound-channel-adapter>的某个适当类型后转换消息。

相关问题