Предисловие
В предыдущей статье, Spring Boot + Layim + T-IO Загрузка файла и мониторинг статуса пользователя, были введены две мелкие детали: статус пользователя в автономном режиме и изменение состояния в количестве людей. Сегодняшним основным контентом является реализация пользователя добавить друзей.
Введение
Добавить друзей. Все знают, что они использовали QQ. Это не что иное, как начать приложение друга. Другая сторона получает уведомление о сообщении, а затем обрабатывает его. Тем не менее, в этой статье рассказывается только о первой половине, и обработка уведомлений о сообщениях будет оставлена на следующую статью. Поскольку содержание слишком много, боюсь, я не могу переваривать его некоторое время. Прежде чем представить основной процесс, позвольте мне сначала представить вам подготовительную работу.
Подготовка
Прежде всего, чтобы сделать данные ближе к фактическому бою, я использовал более «реальные» пользовательские данные. В сочетании с шаблоном мухи улучшается привязка данных пользовательской информации в головке пользовательского центра. Часть привязки данных определяет, являетесь ли вы уже другом, чтобы решить, появляется ли кнопка «Добавить как друга». Пример заключается в следующем: когда пользователь видит свою домашнюю страницу самостоятельно, это так:
Когда вы видите домашнюю страницу пользователя, которая не является другом, выглядит так:
Часть привязки данных, позвольте мне кратко представить ее вам, который состоит в том, чтобы использовать шаблон тимлев для привязки. При доступе к странице в фоновом режиме просто назначьте значение модели.
/ *** Назначение атрибутов**/ private void setModel (пользователь пользователь, модель модели) {long currentUserid = getUserid (); long visitUserid = user.getid (); // Это ваш собственный логический isself = currentUserid == visitUserid; // являются ли эти два пользователя уже друзья Boolean isFriend = Groupservice.isfriend (CurrentUserid, VisitUserid); Map <string, object> usermap = new hashmap <> (8); usermap.put ("avatar", user.getavatar ()); usermap.put ("name", user.getusername ()); usermap.put ("addtime", timeutil.formatdate (user.getCreateat ())+"join"); if (user.getSign () == null || user.getSign (). length () == 0) {usermap.put ("sign", ""); } else {usermap.put ("sign", "(" + user.getSign () + ")"); } usermap.put ("uid", user.getid ()); usermap.put ("self", сам || is friend); model.addattribute («Пользователь», Usermap); }Затем, на странице, извлеките данные из модели.
<div style = "founal-image: url ();"> <input type = "hidden" th: value = "$ {user.uid}" id = "visituid"/> <img src = "" th: src = "$ {user.avatar}" th: alt = "$ {user.name}"/> <h1> th: text = "$ {user.name}"> </p> <i> </i> </h1> <p> <!-<i> </i> <span style = "color: #ff7200;"> 67206flying поцелуй </span>-> <i> </i> <span th: text = "$ {user.addmime}" <!-<i> </i> <pan> из hangzhou </span>-> <i th: if = "$ {user.self == false}"> </i> <a lay-event = "addfriet th: text = "$ {user.sign}"> </p> </div>Хорошо, вышеупомянутое - это простая подготовка. Если вы хотите узнать подробный код, вы можете найти его в конце статьи.
Инициировать приложение друга
Давайте сначала следуем бизнес -анализу Лейма. Прежде всего, нам нужно знать, кого (Toid) мы хотим добавить в качестве друзей. Затем добавьте замечание. Это нормально, чтобы передать эти вещи на бэкэнд. Чтобы избежать табличных запросов, я сделал избыточное имя пользователя и аватар пользователя для хранения системных сообщений. Таблица в основном содержит поля: идентификатор пользователя, аватар пользователя, имя пользователя, применяемый идентификатор пользователя, время приложения, тип приложения, заметки, чтение и другие атрибуты.
Поэтому очень легко инициировать приложение друга. Это дополнительная функция. Фронт-энды проходит идентификатор пользователя и примечания пользователя респондента. Бэк-энд организует данные, которые будут вставлены в базу данных. Код заключается в следующем:
/ *** Отправить приложение друга**/ public jsonResult savefriendapply (Long Toid, String замечание) {armate = htmlutils.htmlescape (замечание); ContextUser user = shiroutil.getCurrentUser (); long userid = long.parselong (user.getUserid ()); int record = ApplyRepoSitory.countbytoidAnduidAndTypeanDresult (toid, userId, ApplyType.Friend, 0); if (record> 0) {return jsonresult.fail ("после применения"); } Apply Apply = new Apply (); Apply.SetType (ApplyType.Friend); Apply.SetToid (TOID); Apply.setRemark (замечание); Apply.Setuid (userId); Apply.setavatar (user.getavatar ()); Apply.SetName (user.getUsername ()); Apply.SetRead (false); Apply.SetResult (0); вернуть SaveApply (применить); }Хорошо, приложение закончилось, что мы будем делать дальше? Правильно, уведомить другую сторону, эй, я отправил вам заявку и быстро его обработал. Я столкнулся здесь с проблемой. Поскольку программа Springboot занимает порт 8080, а T-IO занимает порт 8888, то есть, если я хочу активно позвонить в службу 8888 в бизнесе порта 8080, я не знаю, как получить соответствующий канал. Однако, спросив автора, моя проблема была решена в одном предложении.
Получите ServerGroupContext, и проблема решается.
Бин LayimwebsocketStarter была зарегистрирована, когда была запущена предыдущая программа. Итак, если вы можете получить его на деловой стороне 8080, проблем не будет.
Получите LayimWebSocketStarter, вы можете получить ServerGroupContext, а затем вы можете активно нажать его на сервер.
Конечно, эта вещь, возможно, не была разработана, и я не очень хорошо понимаю вышеуказанную проблему. Это не имеет значения. На самом деле, я хочу объяснить, что если вы активно разжигаете сообщения клиенту со стороны сервера, просто используйте ServerGroupContext.
Активный нажимать на сервер
Следующий код находится в com.fyp.layim.im.common.util.pushutil
ОК, следуйте шагам выше.
Первый шаг - получить LayimwebsocketStarter.
/*** Получить стартер*/private static layiMwebSocketStarter getStarter () {return (layImwebSocketStarter) springutil.getbean ("LayImwebSocketStarter"); }Шаг 2: Получить ServerGroupContext
Private Static ServerGroupContext getServerGroupContext () {return getStarter (). getServerGroupContext (); }Третий шаг - получить канал.
/ ** * GET ChannelContext * */ Private Static CannelContext getChannelContext (String toid) {ServerGroupContext context = getServerGroupContext (); // Найти пользовательский канал CHANKENTEXT CANENTROKENTEXT = context.users.find (context, toid); вернуть ChannelContext; }Четвертый шаг - запуск, и код здесь почти такой же, как часть кода в чате. Основной частью является получение CannelContext, а затем отправить ему сообщение. Если вы не в сети, не волнуйтесь.
/ *** Сервер активно разжигает сообщения**/ public static void pushapplymessage (string toid) {logger.info ("Выполнить метод отправки: pushapplymessage"); LayImtoclientnoticemsgbody Body = new Layimtoclientnoticemsgbody (); ChannelContext ChannelContext = getChannelContext (toid); // сначала определите, является ли он онлайн, затем запросите базу данных, чтобы уменьшить количество запросов if (channelcontext! = Null &&! Channelcontext.isclosed ()) {int count = getApplyService (). GetUnReadMsgcount (long.parselong (toid)); body.setCount (count); push (cannelcontext, body); }} / *** Сервер активно разжигает сообщения** / private static void push (channelcontext cannelcontext, object msg) {try {wsresponse response = bodyconvert.getInstance (). ConvertTotexTresponse (msg); Aio.send (Channelcontext, ответ); } catch (ioException ex) {}}Теперь, когда толчок готов, тогда, когда его подтолкнут? Поскольку толчок сообщений в этой системе не должен быть таким мгновенным, я посмотрел и обнаружил, что в Springboot есть аналогичный механизм событий, поэтому родился Applyevent.
public class ApplyEvent Extends ApplicationEvent {public ApplyEvent (Object Source) {super (Source); } private Long Toid; public long getToid () {return toid; } public ApplyEvent (источник объекта, Long Toid) {super (Source); this.toid = toid; }}Создайте слушателя, чтобы слушать события.
public class ApplyListener реализует ApplicationListener <plapeeVent> {private logger logger = loggerFactory.getLogger (ApplyListener.Class); @Override public void onApplicationEvent (ApplyEvent ApplyEvent) {new Thread () {public void run () {long toid = ApplyEvent.getToid (); // Здесь мы будем называть Push выше pushutil.pushapplymessage (toid.tostring ()); } }.начинать(); }}Тем не менее, у меня есть вопрос, и я обнаружил, что исполнение в слушателе синхронно. Позже, добавление @Async и @enableAsync было бесполезным, поэтому я использовал новый поток (). Start () для достижения асинхронности, чтобы убедиться, что он не влияет на основной процесс применения. (Это вопрос, я не понял)
Наконец, не забудьте добавить слушателя, когда начинается приложение.
public static void main (string [] args) {SpringApplication SpringApplication = новая SpressApplication (LayImapplication.class); / *** Только когда слушатель будет добавлен здесь, будет прослушивающий триггер* ApplyListener - это событие, которое прислушивается к приложениям друзей**/ SpringApplication.AddListeners (new ApplyListener ()); Springapplication.run (args); }Функциональная строчка
Скоро это будет успешным. Мы разжигаем события и публикуем события после того, как приложение Friend будет успешным.
/*** Приложение друга**/@postmapping (value = "/apply-friend") public jsonresult применить (@requestparam ("toid") long toid,@requestparam ("замечание") string замечание) {jsonresult result = ApplyService.SaveFriendApply (to Id, замечание); // Приложение успешно, событие приложения размещено, уведомить TOID для обработки сообщения. Если он не будет в Интернете, он не будет обработан, если (result.issuccess ()) {applicateContext.publishEvent (new ApplyEvent («Apply», Toid)); } return Result; }Функциональная демонстрация
Я так много говорил, позвольте мне показать вам эффект готового продукта. (Пользовательская сцена: Xiaoniao добавляет Императора как друга, Император получает сообщение и проверяет его)
Император получил сообщение, и появилось небольшое число 4 в левом нижнем углу. (Позвоните в метод Layim.msgbox (msgcount))
Император нажал на поле сообщения:
Император получил заявки от своих четырех любимых наложниц и не смог спать или есть. Что бы он сделал? Если вы хотите знать, что будет дальше, пожалуйста, послушайте следующий разрыв ~~~
Суммировать
Эта статья в основном представляет реализацию процесса подключения друга.
Кодовый адрес в статье: https://github.com/fanpan26/springbootlayim
http://xiazai.vevb.com/201712/yuanma/springbootlayim-master.rar
Выше приведено Springboot+Layim+T-IO, введенный вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!