2014-10-29 56 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