2014-10-29 94 views
3

我正在使用Spring集成xmpp模块编写连接到GCM云服务的第三方服务器的自定义实现,如GCM Cloud Connection Server (XMPP)中所述。Spring集成XMPP和Google Cloud Messaging

到目前为止,我已经成功地连接到服务器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> 

我用的是最新版本的SI,4.0.4,这是我在xml配置:

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

我与平时MessageBuilder这样发送消息:

Message<String> xmppOutboundMsg = MessageBuilder.withPayload(xmppPayload) 
     .setHeader(XmppHeaders.TO, REGISTRATION_ID) 
     .build(); 

其中xmppPayload是一个JSON字符串。

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

感谢您的任何帮助。

+0

你可以看一下[我的问题](http://stackoverflow.com/questions/28854835/what-are-the-right-parameters-for -xmpp-connection-spring-integration-to-make-i)并可能有帮助? – hamid 2015-03-05 03:25:01

回答

3

<gcm xmlns="google:mobile:data">是一个扩展的内容元素(参见RFC 6120 8.4),这是在的Smack建模为PacketExtension。别子类的消息,而不是创建一个GCMPacketExtension类和它的一个实例添加到您的消息

message.addPacketExtension(gcmPackExtension) 
+0

请参阅@ GaryRussell关于如何继承和配置消息处理程序以添加此扩展的回答。 – 2014-10-29 22:25:53

+1

谢谢@Flow,这解决了我的问题。我编写了这样的消息:Message xmppMessage = new Message(); xmppMessage.addExtension(new GcmPacketExtension(xmppPayload));并将其发送到出站适配器。 – LittleSquinky 2014-10-30 09:13:28

+0

太棒了!我不能添加更多'+ 1',但如果分享什么'GcmPacketExtension',那将会很棒。哪个jar(工件)包含它? – 2014-10-30 10:00:29

1

消息的格式是硬编码在拍击Message.toXML()方法(我们使用下面的拍击库)。

请参阅@ Flow的答案。

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

配置自定义处理程序最简单的方法可能是把它放在一个chain ...

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

或者你就可以将它作为一个顶级的bean,注入一个ConsumerEndpointFactoryBean

随意打开一个New Feature JIRA Issue,我们将考虑增加一个扩展点,使之成为一个更容易一些。

+0

永远不要分类消息! 'gcm'是一个PacketExtension(按照Smack术语)。另请参阅我的[回复](http://stackoverflow.com/a/26641368/194894)。 BTW Smack不再由Jive软件维护。它处于点燃实时的开源伞下。 – Flow 2014-10-29 21:59:07

+0

谢谢@Flow - 更新了我的答案,指出了您的意见,并保留了OP在Spring集成中需要的代码来设置该选项。我们绝对应该开放一个扩展点来允许添加扩展。 – 2014-10-29 22:19:47

+0

感谢您的回答,我检查了ChatMessageSendingMessageHandler的实现,如果它的类型为org.jivesoftware.smack.packet.Message,则handleMessageInternal将对消息进行简单传递,因此我不需要继承子类。 – LittleSquinky 2014-10-30 09:18:27

1

直到我们介绍PackExtension注射,你可以自定义<transformer ref="">克服它,因为<int-xmpp:outbound-channel-adapter>可以接受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"/> 

public class ToGcmTransformer extends AbstractTransformer { 


    protected Object doTransform(Message<String> message) throws Exception { 
     String to = message.getHeaders().get(XmppHeaders.TO, String.class); 
     xmppMessage = new org.jivesoftware.smack.packet.Message(to); 
     xmppMessage.setBody(message.getPayload()); 
     xmppMessage.addPacketExtension(gcmPackExtension); 
     return xmppMessage; 
    } 

} 

请,引发ISSU e约PackExtension支持。

+2

提供了一个GcmPacketExtension类和提供程序,我打开此问题https://jira.spring.io/browse/INT-3541。 – LittleSquinky 2014-10-30 09:53:40

0

- >

<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" /> 
+0

完整的解释答案更有可能被OP接受,并吸引upvotes。 – kittykittybangbang 2015-06-28 17:41:11

相关问题