消耗队列中的所有对象类型消息

时间:2016-02-26 11:50:38

标签: spring-integration

我有以下配置,它将连接到jms上的特定队列,并将使用来自该队列的消息并将写入文件

现在问题是队列中的消息是对象类型或字符串类型,我只想使用对象类型消息

因此,例如下面是消息的主体,它是对象类型,因此消息头值为

ObjectMessage={ Header={ JMSMessageID={ID:LON_TEST_GAWE_4533.351656B16070206DEBAE:1936} JMSDestination={Queue[erty.retry.object]} JMSReplyTo={null} JMSDeliveryMode={PERSISTENT} JMSRedelivered={false} JMSCorrelationID={null} JMSType={null} JMSTimestamp={Fri Feb 26 11:52:53 IST 2016} JMSExpiration={0} JMSPriority={4} } Properties={ } Object={?} }

如上所述,对于对象消息,消息标题中的首字母文本始于ObjectMessage={ Header={ JMSMessageID={ID:LON

所以请告知我如何使用所有对象类型消息有什么方法我可以将它们存储在文件中

bwlow现在是我的配置仪式..

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:int="http://www.springframework.org/schema/integration"
    xmlns:jms="http://www.springframework.org/schema/integration/jms"
    xmlns:file="http://www.springframework.org/schema/integration/file"

    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans

    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://wert2.fm.absgrp.net:3453</prop>
                <prop key="java.naming.security.principal">aert</prop>
                <prop key="java.naming.security.credentials">aert</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>erty.retry.object</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="erty.retry.object" connection-factory="tibcoEMSConnFactory" /> -->


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

    <int:channel id="jmsInChannel" />



 <file:outbound-channel-adapter id="filesout"  channel="jmsInChannel" directory="C:\\dfgal"
 filename-generator="generatorr" />

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




    <int:payload-type-router input-channel="jmsInChannel"></int:payload-type-router>

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




</beans>

1 个答案:

答案 0 :(得分:1)

对我而言,我在SO上看到了类似的问题。我不想发现它确定是你的,并且有一些答案。

请在使用不清楚的问题之前确保使用搜索。

首先,从架构角度看,您的解决方案看起来很奇怪。

即使我们可以做类似的事情,JMS也不像Kafka那样灵活分区。

我的意思是,消费者从同一队列中读取不同的消息类型并不方便。消费者从队列中读取所有消息的主要问题。我不确定只过滤那些短信并删除它们对您的系统来说是一个很好的解决方案。

无论如何,您可以在<jms:message-driven-channel-adapter>上使用Message,这意味着整个JMS payload将作为Spring Integration Message <payload-type-router>。之后,您可以使用ObjectMessage并将TextMessageself.tableView.tableFooterView = [[UIView alloc] init]; 区分开,并将其发送到不同的渠道:第一个存储在文件中,另一个存储在其他位置。

希望我很清楚。