WedX - журнал о программировании и компьютерных науках

Spring интеграция XMPP и Google Cloud Messaging

Я использую модуль xmpp для весенней интеграции, чтобы написать собственную реализацию стороннего сервера, подключающегося к облачным службам GCM, как в Сервер подключений к облаку GCM (XMPP).

Пока я успешно подключился к серверу 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?

Спасибо за любую помощь.


  • Можете ли вы взглянуть на мой вопрос и возможно поможет? 05.03.2015

Ответы:


1

<gcm xmlns="google:mobile:data"> - это элемент расширенного содержимого (см. RFC 6120 8.4), который моделируется как PacketExtension в Smack. Не подклассифицируйте сообщение, вместо этого создайте класс GCMPacketExtension и добавьте его экземпляр в свое сообщение.

message.addPacketExtension(gcmPackExtension)
29.10.2014
  • См. Ответ @ GaryRussell о том, как создать подкласс и настроить обработчик сообщений для добавления этого расширения. 30.10.2014
  • Спасибо @Flow, это решило мою проблему. Я составил такое сообщение: Сообщение xmppMessage = new Message (); xmppMessage.addExtension (новый GcmPacketExtension (xmppPayload)); и отправил на исходящий адаптер. 30.10.2014
  • Замечательно! Я не могу добавить больше +1, но было бы здорово, если бы поделился тем, что есть GcmPacketExtension. В какой банке (артефакте) он содержится? 30.10.2014
  • @ArtemBilan gcmPacketExtension - это класс в конце этого примера ссылка. Поведение в ссылке - именно то, что мне нужно, поэтому я просто включил его в свою реализацию и назвал его самым простым способом, потому что мне нужно было как можно скорее запустить рабочий сервер, чтобы обеспечить раннее тестирование на стороне клиента. 30.10.2014
  • Теперь Smack предоставляет класс и поставщик GcmPacketExtension с github.com/igniterealtime/ > 30.10.2014

  • 2

    Формат сообщения жестко задан в методе Smack Message.toXML() (мы используем библиотеку smack внизу).

    См. Ответ @ Flow.

    Затем подкласс ChatMessageSendingMessageHandler, переопределив handleMessageInternal() - в значительной степени скопируйте код и установите расширение после создания сообщения.

    Самый простой способ настроить собственный обработчик - это, вероятно, поместить его в _4 _...

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

    Или вы можете подключить его как bean-компонент верхнего уровня и вставить в ConsumerEndpointFactoryBean.

    Не стесняйтесь открывать новую проблему JIRA, и мы рассмотрим возможность добавления точки расширения, чтобы сделать это немного проще.

    29.10.2014
  • Никогда не подклассифицируйте сообщение! gcm - это PacketExtension (в терминах Smack). См. Также мой ответ. Кстати, программа Jive больше не поддерживает Smack. Он находится под эгидой компании ignite realtime с открытым исходным кодом. 30.10.2014
  • Спасибо @Flow - обновил мой ответ, чтобы указать на ваш, и сохранил код, необходимый OP в Spring Integration, чтобы установить этот параметр. Мы обязательно должны открыть точку расширения, чтобы можно было добавлять расширения. 30.10.2014
  • Спасибо за ответ, я проверил реализацию ChatMessageSendingMessageHandler, и handleMessageInternal выполнит простую пересылку сообщения, если оно имеет тип org.jivesoftware.smack.packet.Message, поэтому мне не нужно было создавать подкласс. 30.10.2014
  • Это правда. Я отразил это в своем ответе 30.10.2014

  • 3

    Пока мы не представим инъекцию PackExtension, вы можете преодолеть ее с помощью пользовательского <transformer ref="">, потому что <int-xmpp:outbound-channel-adapter> может принимать org.jivesoftware.smack.packet.Message как Сообщение payload:

    <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;
       }
    
    }
    

    Пожалуйста, поднимите вопрос о поддержке PackExtension.

    30.10.2014

    4
  • Ответ с объяснением с большей вероятностью будет принят ОП и привлечет положительные голоса. 28.06.2015
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]