我在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;
}
答案 0 :(得分:0)
如果JMS失败,那么我将面对jmsTemplate.send中的卡住线程(新的MessageCreator()
如果JMS&#34;发生故障&#34;你应该得到一个例外;第一步是通过使用jstack或类似方法进行线程转储来找出它的位置&#34;卡住&#34;。
如果线程卡在weblogic JMS客户端中且不可中断,那么框架无法提供任何帮助。