如何解决如果未连接外部服务,如何通过“ ReceiveMessageAdvice”添加智能“轮询”以防止轮询
我当前的XML配置如下:
生产者->网关->队列通道(在Oracle DB上持久化)->接收器服务->具有外部会话(例如TCP / IP)的服务
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/integration https://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="outboundFixMessageService" class="com.myapp.OutboundFixMessageService"/>
<int:gateway service-interface="com.myapp.queue.DpOutgoingMessageGateway"
default-request-channel="outgoingChannel"></int:gateway>
<int:channel id="outgoingChannel">
<int:queue message-store="outgoingMessageChannelStore"/>
</int:channel>
<int:service-activator ref="outboundFixMessageService"
method="processOutgoingMessageString"
input-channel="outgoingChannel">
<int:poller fixed-rate="10" time-unit="SECONDS" max-messages-per-poll="1000">
<int:transactional propagation="NESTED" />
</int:poller>
</int:service-activator>
<!-- Persisting queue -->
<bean id="outgoingMessageChannelStore" class="org.springframework.integration.jdbc.store.JdbcChannelMessageStore">
<property name="dataSource" ref="dataSource"/>
<property name="channelMessageStoreQueryProvider" ref="jdbcChannelMessageStoreQueryProvider"/>
<property name="region" value="TX_TIMEOUT"/>
</bean>
<bean id="jdbcChannelMessageStoreQueryProvider" class="org.springframework.integration.jdbc.store.channel.H2ChannelMessageStoreQueryProvider" />
<int:transaction-synchronization-factory id="jdbcChannelMessageStoreFactory">
<int:after-commit expression="@jdbcChannelMessageStore.removeFromIdCache(headers.id.toString())" />
<int:after-rollback expression="@jdbcChannelMessageStore.removeFromIdCache(headers.id.toString())" />
</int:transaction-synchronization-factory>
</beans>
现在,我想在ReceiveMessageAdvice
和outboundFixMessageService
之间添加Smart "Polling",以防止在服务激活器if(key && value) {
// if the key exists
if(localStorage.getItem(key)){
// split the existing values into an array
let vals = localStorage.getItem(key).split(',');
// if the value has not already been added
if(! vals.includes(value)){
// add the value to the array
vals.push(value);
// sort the array
vals.sort();
// join the values into a delimeted string and store it
localStorage.setItem(key,vals.join(','));
}
}else{
// the key doesn't exist yet,add it and the new value
localStorage.setItem(key,value);
}
location.reload();
}
与外部连接之间没有活动会话的情况下进行轮询。
但是我不知道如何配置它,再次找不到在哪里查找示例项目。
如果您可以提出一些建议,那将很棒。
预先感谢
解决方法
ReceiveMessageAdvice
具有为您的目的而覆盖的方法:
/**
* Subclasses can decide whether to {@link MethodInvocation#proceed()} or not.
* @param source the source of the message to receive.
* @return true to proceed (default).
*/
default boolean beforeReceive(Object source) {
return true;
}
因此,如果您有一个钩子可以检查该会话的状态,则只需从该方法返回false
,就不会进行轮询。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。