如何使用Spring Integration将消息发送到JMS目标时合并超时?

时间:2015-12-04 07:37:39

标签: spring spring-integration

我在Weblogic服务器上使用Spring Web服务。在每个请求上,我使用JMSTemplate将JMS消息发送到JMS目标。以下是我的弹簧配置。

<int:channel id="input" />

<int:channel id="output">
    <int:dispatcher failover="true" load-balancer-ref="failoverStrategy" />
</int:channel>

<bean id="failoverStrategy" class="c.x.FailoverStrategy">
    <constructor-arg index="0">
        <list>
            <ref bean="synMessageDispatcher" />
            <ref bean="failoverHandler" />
        </list>
    </constructor-arg>
</bean>

<int:channel id="xml" />

<int-xml:marshalling-transformer
    input-channel="input" output-channel="xml" marshaller="marshaller"
    result-type="StringResult" />

<int:object-to-string-transformer
    input-channel="xml" output-channel="output" />

<bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    <property name="contextPath" value="c.x.domain" />
</bean>

<bean id="failoverHandler"
    class="org.springframework.integration.file.FileWritingMessageHandler">
    <constructor-arg index="0">
        <bean class="java.io.File">
            <constructor-arg index="0" value="./synfailed" />
        </bean>
    </constructor-arg>
    <property name="appendNewLine" value="true" />
    <property name="autoCreateDirectory" value="true" />
    <property name="charset" value="utf-8" />
    <property name="expectReply" value="false" />
</bean>

<bean id="pollableFileSource"
    class="org.springframework.integration.file.FileReadingMessageSource"
    p:filter-ref="compositeFilter">
    <constructor-arg index="0" ref="failedMessageComparator" />
    <property name="scanEachPoll" value="false" />      
    <property name="directory">
        <bean class="java.io.File">
            <constructor-arg index="0" value="./synfailed" />
        </bean>
    </property>
</bean>

<task:scheduled-tasks>
    <task:scheduled ref="synMessageDispatcher" method="run"
        fixed-rate="10000" />
</task:scheduled-tasks>

<bean id="compositeFilter"
    class="org.springframework.integration.file.filters.CompositeFileListFilter">
    <constructor-arg>
        <list>
            <bean class="org.springframework.integration.file.filters.SimplePatternFileListFilter">
                <constructor-arg index="0" value="*.msg"/>              
            </bean>         
        </list>
    </constructor-arg>
</bean>

我使用bean自定义&#34; failoverStrategy&#34;在某些情况下工作正常。

如果客户端没有请求,并且JMS发生故障,那么后续请求将由&#34; failoverHandler&#34;成功处理。 (这只是将消息持久保存到文件系统。

如果来自客户端的请求持续流动,并且如果JMS发生故障,那么我将面对jmsTemplate.send(new MessageCreator()处的卡住线程。由于没有超时属性,请求永远停止,我必须重新启动weblogic服务器!请建议如何解决这个问题。

以下代码段显示了我如何发送JMS消息

try {

        jmsTemplate.send(new MessageCreator() {

            @Override
            public javax.jms.Message createMessage(Session arg0)
                    throws JMSException {
                // TODO Auto-generated method stub
                TextMessage message = arg0.createTextMessage(text);
                // message.setIntProperty(MESSAGE_COUNT, index);

                log.debug("Sending message: " + text);

                jmsAvailable = true;

                return message;
            }
        });
    } catch (Exception e) {
        throw new MessagingException(e.getMessage());
    }

以下是我的JMS相关配置。

@Bean
    public JmsTemplate jmsTemplate() throws JMSException {
        JmsTemplate jmsTemplate = new JmsTemplate();
        jmsTemplate.setConnectionFactory(cachingConnectionFactory());
        jmsTemplate.setDefaultDestinationName(syn_mpg_queue);

        return jmsTemplate;
    }

    @Bean
    public CachingConnectionFactory cachingConnectionFactory()
            throws JMSException {
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
        cachingConnectionFactory
                .setTargetConnectionFactory(connectionFactory());
        cachingConnectionFactory.setSessionCacheSize(10);
        cachingConnectionFactory.setReconnectOnException(true);
        cachingConnectionFactory.setCacheProducers(true);
        return cachingConnectionFactory;
    }

    @Bean
    public ConnectionFactory connectionFactory() throws JMSException {
        TibjmsQueueConnectionFactory targetConnectionFactory = new TibjmsQueueConnectionFactory();
        targetConnectionFactory.setServerUrl("tcp://" + jmsServerIp + ":"
                + jmsServerPort);
        return targetConnectionFactory;
    }

1 个答案:

答案 0 :(得分:0)

  

如果JMS失败,那么我将面对jmsTemplate.send中的卡住线程(新的MessageCreator()

如果JMS&#34;发生故障&#34;你应该得到一个例外;第一步是通过使用jstack或类似方法进行线程转储来找出它的位置&#34;卡住&#34;。

如果线程卡在weblogic JMS客户端中且不可中断,那么框架无法提供任何帮助。