从不同的HTTP请求访问Spring bean

时间:2014-07-10 18:10:34

标签: java spring spring-integration

我现在知道如何手动启动和停止通道适配器,这要归功于Gary Russells回答我之前关于SO的问题:Spring Integration manually start/stop channel adapter via control bus

我的应用程序现在作为tomcat上的servlet运行。现在,除了启动此频道的请求之外,还有其他请求停止频道吗?我不确定范围问题,但它告诉我,就好像每个请求都在创建一个新网关,因此我发出了一个" stop"来自后来的请求的命令只会停止一个从未在第一个地方开始的新实例。或者我错了吗?

我的目标是创建一个宁静的Web服务,该服务公开端点以通过MQTT发布/订阅/取消订阅,例如

http://someDomain/myModule/publishOverMQTT?topic=cloud&clientID=myClient&payload=myMsg
http://someDomain/myModule/subscribeOverMQTT&URL=someMQTTBrokerURL%clientID=myClient&topics=topic1,topic2,topic3

既然这是作为servlet部署的,那么如何实现"取消订阅"请求?根据我的理解,通过停止通道在Spring Integration中完成取消订阅。 !但是!是否可以从请求中停止某个频道,而不是启动它的请求?

这是我的context.xml:

<int:control-bus input-channel="controlChannel"/>

<int:gateway
    service-interface="MyGateway"
    default-request-channel="controlChannel"/>

<int-mqtt:message-driven-channel-adapter
    auto-startup="false"
    id="mqttInput" 
    client-id="#{controller.mqttSubscriberConfig.clientID}"
    url="#{controller.mqttSubscriberConfig.completeURL}"
    topics="#{controller.mqttSubscriberConfig.topic}"
    channel="loggingChannel" />

<int:logging-channel-adapter id="loggingChannel" />

在下面的Gary Russells回答中建议实现一个hashmap,我的控制器现在看起来像这样:

@RequestMapping("/subscribe")
public @ResponseBody void subscribe(
        @RequestParam(value="topics",   required=true) String topics,
        @RequestParam(value="clientID", required=true) String clientID,
        @RequestParam(value="url",      required=false) String url,
        @RequestParam(value="port",     required=false, defaultValue="1883") Integer port,
        HttpServletRequest request)
{
    mqttSubscriberConfig = new MQTTSubscriberConfiguration();
    mqttSubscriberConfig.setTopic(topics);
    mqttSubscriberConfig.setClientID(clientID);
    mqttSubscriberConfig.setURL(url);
    mqttSubscriberConfig.setPort(port);

    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
    ctx.getEnvironment().setActiveProfiles("sub");
    ctx.load("mqtt-context.xml");
    ctx.refresh();

    ((MyGateway)ctx.getBean(MyGateway.class)).control("@mqttInput.start()");

    ctxMap.put(clientID, ctx);
}

@RequestMapping("/unsubscribe")
public @ResponseBody void unsubscribe(
        @RequestParam(value="clientID", required=true) String clientID,
        HttpServletRequest request)
{
    GenericXmlApplicationContext ctx = ctxMap.get(clientID);
    ctx.destroy();
}

STILL ,我有一种强烈的感觉,我不应该为每个请求创建一个上下文。正确?

1 个答案:

答案 0 :(得分:1)

Spring Integration bean没有请求范围;所有请求共享相同的Spring Integration Infrastructure。

不清楚你的意思是&#34;创建HTTP端点来开始/停止订阅&#34;。