Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring集成XMPP和Google云消息_Xmpp_Spring Integration_Google Cloud Messaging - Fatal编程技术网

Spring集成XMPP和Google云消息

Spring集成XMPP和Google云消息,xmpp,spring-integration,google-cloud-messaging,Xmpp,Spring Integration,Google Cloud Messaging,我正在使用spring integration xmpp模块编写一个连接到GCM云服务的第三方服务器的自定义实现,如中所示 到目前为止,我已成功连接到GCM服务器,但是,当我向服务器发送消息时,我会得到如下结果: <message id="m-1366082849205" to="REGISTRATION_ID"> <body>{"hello":"world"}</body> </message> {“你好”:“世界”} ,但我需要发送如下内

我正在使用spring integration xmpp模块编写一个连接到GCM云服务的第三方服务器的自定义实现,如中所示

到目前为止,我已成功连接到GCM服务器,但是,当我向服务器发送消息时,我会得到如下结果:

<message id="m-1366082849205" to="REGISTRATION_ID">
<body>{"hello":"world"}</body>
</message>

{“你好”:“世界”}
,但我需要发送如下内容:

  <message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGISTRATION_ID",
      "message_id":"m-1366082849205"
      "data":
      {
          "hello":"world",
      }
  }
  </gcm>
</message>
Message<String> xmppOutboundMsg = MessageBuilder.withPayload(xmppPayload)
        .setHeader(XmppHeaders.TO, REGISTRATION_ID)
        .build();

{
“收件人”:“注册号”,
“消息id”:“m-1366082849205”
“数据”:
{
“你好”:“世界”,
}
}
我使用最新的SI版本4.0.4,这是我在xml中的配置:

<int-xmpp:outbound-channel-adapter
    id="gcmOutboundAdapter" channel="gcmOutboundNotificationChannel"
    xmpp-connection="gcmConnection" auto-startup="true"/>

我使用常见的MessageBuilder发送消息,如下所示:

  <message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGISTRATION_ID",
      "message_id":"m-1366082849205"
      "data":
      {
          "hello":"world",
      }
  }
  </gcm>
</message>
Message<String> xmppOutboundMsg = MessageBuilder.withPayload(xmppPayload)
        .setHeader(XmppHeaders.TO, REGISTRATION_ID)
        .build();
Message xmppOutboundMsg=MessageBuilder.withPayload(xmppPayload)
.setHeader(XmppHeaders.TO,注册号)
.build();
其中xmppPayload是一个json字符串

我需要配置/覆盖xmpp消息的组成方式,实现结果的最佳实践是什么?我是否应该用自定义服务激活器重写实现int-xmpp:outbound-channel-adapter的类,是否仍然需要配置xmpp消息的组成方式


感谢您的帮助。

消息的格式在Smack
message.toXML()方法中进行了硬编码(我们使用下面的Smack库)

见@Flow的答案

然后,子类ChatMessageSendingMessageHandler
,覆盖
handleMessageInternal()
——在消息创建后复制代码并设置扩展名

配置自定义处理程序的最简单方法可能是将其放入
链中

<chain input-channel="gcmOutboundNotificationChannel">
    <bean class="foo.MyChatMessageSendingMessageHandler">
        <constructor-arg ref="gcmConnection" />
    </bean>
</chain>

或者,您可以将其连接为顶级bean,并将其注入到
ConsumerEndpointFactoryBean

自由打开A,我们将考虑添加一个扩展点,使这更容易。

< P> <代码> <代码>是一个扩展内容元素(参见RFC 6120 8.4),它被建模为SMAK中的包扩展。不要将消息子类化,而是创建一个gcmpacktextension类,并将其实例添加到消息中

message.addPacketExtension(gcmPackExtension)

在我们引入
PackExtension
注入之前,您可以通过定制
来克服它,因为
可以接受
org.jivesoftware.smack.packet.Message
作为消息
有效负载

<transformer ref="toGcmTransformer" output-channel="gcmOutboundNotificationChannel"/>

<int-xmpp:outbound-channel-adapter
    id="gcmOutboundAdapter" channel="gcmOutboundNotificationChannel"
    xmpp-connection="gcmConnection" auto-startup="true"/>


公共类ToGcmTransformer扩展了AbstractTransformer{
受保护对象DotTransform(消息)引发异常{
String to=message.getHeaders().get(XmppHeaders.to,String.class);
xmppMessage=new org.jivesoftware.smack.packet.Message(to);
xmppMessage.setBody(message.getPayload());
xmppMessage.addPacketExtension(gcmPackExtension);
返回xmppMessage;
}
}
请提出一个关于PackExtension支持的问题。

-->

<int:chain input-channel="gcmOutboundNotificationChannel">
    <!--<int:transformer ref="toGcmTransformer" output-channel="gcmOutboundNotificationChannel"/>-->
    <bean class="com.payumoney.cardhash.service.MyMessageSendingMessageHandler">
        <constructor-arg ref="gcmConnection" />
    </bean>
</int:chain>
<int:transformer id="testTransformer" ref="toGcmTransformer" input-channel="gcmInboundNotificationChannel"
         method="doTransform" output-channel="gcmOutboundNotificationChannel"/>
<!--<int:transformer ref="toGcmTransformer" output-channel="gcmOutboundNotificationChannel"/>-->

<int-xmpp:outbound-channel-adapter
    id="gcmOutboundAdapter" channel="gcmOutboundNotificationChannel"
    xmpp-connection="gcmConnection" auto-startup="true"/>

<int:chain input-channel="gcmInboundNotificationChannel">
    <bean class="com.payumoney.cardhash.service.PayumoneyNotificationListeningEndpoint">
        <constructor-arg ref="gcmConnection" />
        <property name="outputChannel" ref="gcmOutboundNotificationChannel" />
    </bean>
</int:chain>

<int-xmpp:inbound-channel-adapter 
    id="gcmInboundAdapter"  channel="gcmInboundNotificationChannel" 
    xmpp-connection="gcmConnection" extract-payload="true" auto-startup="true" />


永远不要将消息子类化
gcm
是一种打包扩展(用Smack术语)。另见我的报告。顺便说一句,Smack不再由Jive软件维护。它在ignite realtime的开源保护伞下。感谢@Flow-更新了我的答案,指向您的答案,并保留了OP在Spring Integration中设置该选项所需的代码。我们肯定应该打开一个扩展点来允许添加扩展。感谢您的回答,我检查了ChatMessageSendingMessageHandler的实现,如果消息类型为org.jivesoftware.smack.packet.message,handleMessageInternal将对消息进行简单的传递,所以我不需要子类化。这是真的。我在我的回答中反映了这一点,请参阅@GaryRussell关于如何子类化和配置消息处理程序以添加此扩展的回答。谢谢@Flow,这解决了我的问题。我编写了如下消息:message xmppMessage=new message();xmppMessage.addExtension(新的gcmpacktextension(xmppPayload));并将其发送到出站适配器。太棒了!我不能再添加更多的
+1
,但如果能分享
gcmpacktextension
,那就太好了。哪个jar(工件)包含它?@ArtemBilan gcmpacktextension是本示例末尾的类。链接中的行为正是我所需要的,所以我只是将其放在我的实现中,并以最简单的方式调用它,因为我必须尽快启动一个工作服务器,以便能够在客户端进行早期测试。Smack现在提供了一个GCMPackTexttension类和提供程序,您可以看一看并可能提供帮助吗?一个完整的解释答案更有可能被OP接受,并吸引更多的投票。