머리말
이전 기사에서 Spring Boot + Layim + T-IO 파일 업로드 및 모니터링 사용자 상태에서 사용자의 오프라인 상태와 상태가 사람들 수의 변경 사항이라는 두 가지 작은 세부 사항이 소개되었습니다. 오늘날의 주요 콘텐츠는 사용자 추가 친구의 구현입니다.
소개
친구 추가. 누구나 QQ를 사용했다는 것을 알고 있습니다. 친구 신청을 시작하는 것 이상입니다. 상대방은 메시지 알림을받은 다음 처리합니다. 그러나이 기사는 전반전에 대해서만 이야기하며 메시지 알림 처리는 다음 기사로 남을 것입니다. 내용이 너무 많아서 잠시 동안 소화 할 수 없을 까봐 두려워합니다. 주요 프로세스를 소개하기 전에 먼저 준비 작업을 소개하겠습니다.
준비
우선, 데이터를 실제 전투에 더 가깝게 만들기 위해 더 "실제"사용자 데이터를 사용했습니다. 플라이 템플릿과 결합하여 사용자 센터 헤드에서 사용자 정보의 데이터 바인딩이 개선됩니다. 데이터 바인딩 부분은 이미 "친구 추가"버튼이 나타나는지 여부를 결정하는 이미 친구인지 결정합니다. 예제는 다음과 같습니다. 사용자가 자신의 홈페이지를 스스로 볼 때 다음과 같습니다.
친구가 아닌 사용자의 홈페이지를 볼 때 다음과 같이 보입니다.
바인딩 데이터 부분은 Thymleaf 템플릿을 사용하여 바인딩하는 것입니다. 백그라운드에서 페이지에 액세스 할 때 모델 값을 할당하십시오.
/ *** 속성 할당**/ 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 ( "아바타", 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 ( "부호", "(" + user.getSign () + ")"); } usermap.put ( "uid", user.getid ()); usermap.put ( "self", isself || isfriend); model.addattribute ( "사용자", usermap); }그런 다음 페이지에서 모델에서 데이터를 추출하십시오.
<div style = "background-image : url ();"> <input type = "hidden"th : value = "$ {user.uid}"id = "visituid"/> <img src = ""th : src = "$ {user.avatar}"th : alt = "$ {user.name}"/> <p. th : text = "$ {user.name}"> </p> <i> </i> </h1> <p> <!-</i> <span style = "color : #ff7200;"> 67206flying </span>-> <i> </i> <span th : "$ {user.addtime}"> <!-hangzhou의 <i> </i> <span> </i> <span>->->-> <i th : if = "$ {user.self == false}"> </i> <a lay-event = "addfriend"href = "#"rel = "external nofollow"th : if = "$ {user.self == false}"> 친구 </p> </p> </p> </p> </p> </p> </p> th : text = "$ {user.sign}"> </p> </div>좋아요, 위는 간단한 준비입니다. 자세한 코드를 알고 싶다면 기사 끝에서 검색 할 수 있습니다.
친구 신청서를 시작하십시오
먼저 Layim의 비즈니스 분석을 따르겠습니다. 우선, 우리는 친구로 추가하고 싶은 사람 (TOID)을 알아야합니다. 그런 다음 비고를 추가하십시오. 이 것들을 백엔드로 넘겨주는 것은 괜찮습니다. 테이블 쿼리를 피하기 위해 시스템 메시지를 저장하기 위해 중복 사용자 이름과 사용자 아바타를 만들었습니다. 테이블에는 주로 사용자 ID, 사용자 아바타, 사용자 이름, 응용 사용자 ID, 응용 프로그램 시간, 응용 프로그램 유형, 노트, 읽기 및 기타 속성이 포함되어 있습니다.
따라서 친구 신청서를 시작하는 것은 매우 쉽습니다. 추가 된 기능입니다. 프론트 엔드는 응답자의 사용자 ID 및 응용 프로그램 노트를 전달합니다. 백엔드는 데이터를 데이터베이스에 삽입 할 데이터를 구성합니다. 코드는 다음과 같습니다.
/ *** 친구 신청서 제출**/ public jsonresult saverfriendApply (long toid, string warting) {warick = htmlutils.htmlescape (warting); ContextUser user = shiroutil.getCurrentUser (); long userId = long.parselong (user.getUserId ()); int record = applyRepository.CountByToidAndUidandTypeanDerult (TOID, USERID, FASPOSTTYPE.Friend, 0); if (record> 0) {return jsonresult.fail ( "응용 후"); } apply apply = new apply (); apply.settype (appresstype.friend); apply.settoid (toid); apply.setRemark (비고); apply.setuid (userId); apply.setavatar (user.getavatar ()); apply.setName (user.getUername ()); apply.setread (false); apply.setResult (0); SaveApply를 반환합니다 (적용); }좋아, 신청서가 끝났습니다. 다음에 무엇을 할 것인가? 맞습니다. 상대방에게 알리십시오. 이봐, 나는 당신에게 응용 프로그램을 보냈고 신속하게 처리합니다. 여기서 문제가 발생했습니다. SpringBoot 프로그램은 포트 8080을 차지하고 T-IO는 포트 8888을 차지하기 때문에 포트 8080의 비즈니스에서 8888의 서비스 푸시를 적극적으로 호출하려면 해당 ChannelContext를 얻는 방법을 모르겠습니다. 그러나 저자에게 물어 본 후, 내 문제는 한 문장으로 해결되었습니다.
ServerGroupContext를 가져 오면 문제가 해결됩니다.
이전 프로그램이 시작될 때 LayimwebsocketStarter Bean이 등록되었습니다. 따라서 8080 비즈니스 측면에서 얻을 수 있다면 아무런 문제가 없습니다.
LayImwebSocketStarter를 얻으면 ServerGroupContext를 얻을 수 있으며 서버에서 활성으로 푸시 할 수 있습니다.
물론,이 일은 개발되지 않았을 수도 있으며, 위의 문제를 잘 이해하지 못합니다. 중요하지 않습니다. 실제로 서버 측에서 클라이언트에 메시지를 적극적으로 푸시하면 ServerGroupContext를 사용한다고 설명하고 싶습니다.
서버에서 활성 푸시
다음 코드는 com.fyp.layim.im.common.util.pushutil입니다
좋아, 위의 단계를 따르십시오.
첫 번째 단계는 LayimwebsocketStarter를 얻는 것입니다.
/*** 스타터 가져 오기*/개인 정적 LayimwebSocketStarter getStarter () {return (layimwebsocketstarter) springUtil.getBean ( "LayimwebsocketStarter"); }2 단계 : ServerGroupContext를 가져옵니다
private static servergroupContext getServerGroupContext () {return getStarter (). getServerGroupContext (); }세 번째 단계는 ChannelContext를 얻는 것입니다.
/ ** * get get get get get get get get get get gettic channelContex getChannelContext (string toid) {serverGroupContext context = getServerGroupContext (); // 사용자 channelContext ChannelContext = context.users.find (context, toid)를 찾습니다. return ChannelContext; }네 번째 단계는 시작하는 것이며 여기의 코드는 채팅의 코드의 일부와 거의 동일합니다. 핵심 부분은 ChannelContext를 얻은 다음 메시지를 보내는 것입니다. 온라인이 아니라면 걱정하지 마십시오.
/ *** 서버는 메시지를 적극적으로 푸시합니다**/ public static void pushapplymessage (string toid) {logger.info ( "보내기 메소드 실행 : pushapplyMessage"); layimtoclientnoticemsgbody body = new layimtoclientnoticemsgbody (); ChannelContext Chann // 먼저 온라인 상태 여부를 결정한 다음 데이터베이스를 쿼리하여 (chant body.setcount (count); 푸시 (ChannelContext, body); }} / *** 서버는 메시지를 적극적으로 푸시합니다** / private static void push (ChannelContext Chann aio.send (ChannelContext, 응답); } catch (ioexception ex) {}}이제 푸시가 끝났으므로 언제 밀어 올까요? 이 시스템의 메시지를 추진하는 것은 그다지 순간적 일 필요는 없기 때문에 SpringBoot에 비슷한 이벤트 메커니즘이 있다는 것을 알았으므로 ApplyEvent가 탄생했습니다.
Public Class ApplyEvent는 ApplicationEvent {public applyEvent (Object Source) {super (source); } 개인 긴 토드; 공개 long getToid () {return toid; } public applyEvent (Object Source, long toid) {super (source); this.toid = toid; }}이벤트를 듣는 청취자를 만듭니다.
공개 클래스 ApplyListener 구현 ApplicationListener <ApplyEvent> {private logger = loggerfactory.getLogger (applyListener.class); @override public void onapplicationEvent (applyEvent applyEvent) {new Thread () {public void run () {long toid = applyEvent.getToid (); // 여기서 우리는 pushutil.pushapplymessage 위의 푸시를 호출합니다 (toid.toString ()); } }.시작(); }}그러나 질문이 있고 청취자의 실행이 동기식이라는 것을 알았습니다. 나중에 @async 및 @enableasync를 추가하는 것은 쓸모가 없었으므로 새로운 스레드 (). start ()를 사용하여 비동기식을 달성하여 기본 응용 프로그램 프로세스에 영향을 미치지 않도록했습니다. (이것은 질문입니다. 나는 그것을 알아 내지 못했습니다)
마지막으로 응용 프로그램이 시작될 때 리스너를 추가하는 것을 잊지 마십시오.
public static void main (String [] args) {SpringApplication SpringApplication = 새로운 SpringApplication (layiMapplication.class); / *** 청취자가 여기에 추가 될 때만 리스너 트리거* ApplyListener는 친구의 응용 프로그램에 리스팅되는 이벤트입니다.*/ springApplication.addListeners (new ApplyListener ()); SpringApplication.run (Args); }기능적 스티칭
곧 성공할 것입니다. 우리는 친구 신청이 성공한 후 이벤트를 시작하고 이벤트를 게시하고 있습니다.
/*** 친구 응용 프로그램**/@postmapping (value = "/apply-friend") public jsonresult apply (@requestparam ( "toid") long toid,@requestparam ( "warling") 문자열) {jsonresult result = applicservice.savefriendapply (toid, warne); // 응용 프로그램이 성공하고 응용 프로그램 이벤트가 게시되고 ToID가 메시지를 처리하도록 알립니다. 온라인 상태가 아닌 경우 (result.issuccess ()) {applicationcontext.publishevent (new applyEvent ( "apply", toid)) 인 경우 처리되지 않습니다. } 반환 결과; }기능적 데모
너무 많이 이야기했습니다. 완제품의 효과를 보여 드리겠습니다. (사용자 장면 : Xiaoniao는 황제를 친구로 추가하고 황제는 메시지를 받고 확인합니다).
황제는 메시지를 받았으며 왼쪽 하단 코너의 적은 4 명이 나타났습니다. (layim.msgbox (msgcount) 메소드를 호출하십시오)
황제는 메시지 상자를 클릭했습니다.
황제는 그의 4 명의 사랑하는 첩으로부터 응용 프로그램을 받았으며 잠을 잘 수 없었습니다. 그는 무엇을할까요? 다음에 무슨 일이 일어나는지 알고 싶다면 다음 분석을 들어주십시오 ~~~
요약
이 기사는 주로 친구 어드먼트 프로세스의 구현을 소개합니다.
기사의 코드 주소 : https://github.com/fanpan26/springbootlayim
http://xiazai.vevb.com/201712/yuanma/springbootlayim-master.rar
위는 편집기가 소개 한 SpringBoot+Layim+T-Io입니다. 나는 그것이 당신에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!