Spring集成XMPP和Google云消息
我正在使用spring integration xmpp模块编写一个连接到GCM云服务的第三方服务器的自定义实现,如中所示 到目前为止,我已成功连接到GCM服务器,但是,当我向服务器发送消息时,我会得到如下结果: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> {“你好”:“世界”} ,但我需要发送如下内
<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接受,并吸引更多的投票。