1

我正在尝试在客户端轮询数据库并通过 HTTP 将结果发送到收集数据的服务器。不幸的是,只有第一条消息被传递。我是弹簧集成的新手(1.0.3)

我的配置有什么问题?

客户端配置:

<si:channel id="msgChannel">
    <si:queue capacity="1" />
</si:channel>

<si:inbound-channel-adapter ref="jdbcInputAdapter" method="fetchData" channel="msgChannel">
    <si:poller max-messages-per-poll="1"> 
        <si:interval-trigger interval="5000" />
    </si:poller>
</si:inbound-channel-adapter>

<http:outbound-gateway id="httpChannelAdapter" request-channel="msgChannel" default-url="http://localhost:8080/company/gateway"/>

<si:poller default="true">
    <si:interval-trigger interval="5000" />
</si:poller>

服务器配置:

<si:channel  id="requestChannel">
        <si:queue capacity="4" />
</si:channel>

<si:channel id="replyChannel" />

<http:inbound-gateway id="InboundGateway" request-channel="requestChannel" reply-channel="replyChannel"/>

<bean id="shouter" class="com.company.Shouter"/>
<si:outbound-channel-adapter ref="shouter"  method="shout" channel="replyChannel"/>

<si:service-activator input-channel="requestChannel"
    ref="StorageService" method="store"
    output-channel="replyChannel" />

<bean id="StorageService" class="com.company.StorageService" />

<si:poller default="true">
        <si:interval-trigger interval="1000" />
</si:poller>

编辑:每次我重新启动客户端时,服务器都会收到一条消息。

已解决:我不得不将 StorageService 的签名从

public void store(Message msg)

public Message store(Message msg)
4

2 回答 2

3

如果您喜欢使用 void 签名,请使用 http:inbound-channel-adapter 而不是 http:inbound-gateway。

通常,所有网关都是双向的,所有通道适配器都是单向的,因此网关将等待或生成响应,而通道适配器则不会。

服务激活器可以执行这两种角色,具体取决于它所包裹的方法的返回类型。事实证明,这也是您的问题的原因。

顺便说一句:您还可以让您的方法接受消息的有效负载,这将更容易测试和重用。

public StorageResult store(Storable s, Map headers);
于 2010-06-28T12:41:58.193 回答
-1

尝试删除队列容量。为什么你还有它们呢?

于 2010-06-25T12:35:11.257 回答