【问题标题】:Spring XMPP GCM inbound channel not invoking service activator functionSpring XMPP GCM 入站通道不调用服务激活器功能
【发布时间】:2016-10-02 11:57:06
【问题描述】:

以下是我的spring xmpp集成配置中的sn-p,

<context:property-placeholder location="classpath:xmpp.properties"/>

    <int-xmpp:inbound-channel-adapter auto-startup="true" 
    payload-expression="getExtension('google:mobile:data').json"
    channel="xmppChannel"
     xmpp-connection="xmppConnection" />

        <int:service-activator ref="xmppMessageConsumer" 
        input-channel="xmppChannel"/>

<int:logging-channel-adapter id="xmppChannel" log-full-message="true"
        />

这是我的服务激活器定义

import org.apache.log4j.Logger;
import org.springframework.messaging.Message;

import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.stereotype.Component;

@Component
public class XmppMessageConsumer {
    private final List<String> xmppMessages;
    private static final Logger LOGGER = Logger.getLogger(XmppMessageConsumer.class);
    public XmppMessageConsumer() {
        // TODO Auto-generated constructor stub
        xmppMessages=new ArrayList<String>();

    }

  @ServiceActivator
   public void consume(Message<?> input) throws Throwable {
      String text = (String)input.getPayload();
      xmppMessages.add(text);
      LOGGER.info(text);


   }

从日志中我可以看到频道收到的消息,但是服务激活器功能没有被调用。

10:48:59 PM RECV (0): <message to="588523657007@gcm.googleapis.com" from="devices@gcm.googleapis.com" type="normal"><gcm xmlns="google:mobile:data">{"data":{"Hello":"How are you"},"time_to_live":0,"from":"dqWxVXwH7HU:APA91bFco6xelMctjv5nMgeAIiZtH7TCCMX5a6UZ-ae2yNkBxLh-zVqy32gm6bd1IC3pyKCEwnYOFiBn4au-4XvPn8TzTvikGUNfeQ_1RN_TMk-9dyJ2WtJXVr7RCn0AGynToTWCZ7oC","message_id":"1Id","category":"com.google.firebase.quickstart.fcm"}</gcm></message>

我的假设是通过定义有效载荷表达式,消息解析由框架负责。如果我错了,请纠正我。

【问题讨论】:

    标签: spring spring-mvc google-cloud-messaging spring-integration


    【解决方案1】:

    根据您当前的配置,您有两个订阅者xmppChannel - 服务激活器和日志适配器。

    当您有两个消费者订阅同一个频道(默认为DirectChannel)时,消息将交替发送到两个消费者 - 循环分发。

    如果您希望文件同时发送给两个消费者,请将其更改为发布/订阅频道。

    <int:publish-subscribe-channel id="xmppChannel"/>
    

    如果您为org.springframework.integration 启用调试日志记录,您可以在整个流程中跟踪消息。

    【讨论】:

    • 谢谢@gary,但是现在我注意到消息没有被转发到我的频道。由于某种原因,从连接接收到的消息被丢弃。我注意到的日志来自连接。我需要实施 GCM 扩展吗?当我们指定有效负载表达式时,我假设 spring 集成为 gcm xmpp 提供了开箱即用的支持。如果我错了,请纠正我。
    • 如果消息被丢弃,很可能您的表达式计算结果为 null。如果您的日志级别至少为 INFO,您将收到一条日志消息。我的表情看起来不错;我建议你在ChatMessageListeningEndpoint 中使用调试看看发生了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多