Kata pengantar
Dalam artikel sebelumnya, Spring Boot + Layim + T-IO mengunggah file dan memantau status pengguna, dua detail kecil telah diperkenalkan: status offline pengguna dan status perubahan dalam jumlah orang. Konten utama saat ini adalah implementasi pengguna Tambahkan Teman.
Perkenalan
Tambahkan teman. Semua orang tahu bahwa mereka telah menggunakan QQ. Tidak lebih dari memulai aplikasi teman. Pihak lain menerima pemberitahuan pesan dan kemudian memprosesnya. Namun, artikel ini hanya berbicara tentang babak pertama, dan pemrosesan pemberitahuan pesan akan diserahkan pada artikel berikutnya. Karena isinya agak terlalu banyak, saya khawatir saya tidak bisa mencernanya untuk sementara waktu. Sebelum memperkenalkan proses utama, izinkan saya memperkenalkan pekerjaan persiapan kepada Anda terlebih dahulu.
Persiapan
Pertama -tama, untuk membuat data lebih dekat ke pertempuran yang sebenarnya, saya menggunakan lebih banyak data pengguna "nyata". Dikombinasikan dengan templat terbang, pengikatan data informasi pengguna di kepala pusat pengguna ditingkatkan. Bagian pengikatan data menentukan apakah Anda sudah menjadi teman untuk memutuskan apakah tombol "Tambah sebagai Teman" muncul. Contohnya adalah sebagai berikut: Ketika pengguna melihat beranda sendirian, seperti ini:
Ketika Anda melihat beranda pengguna yang bukan teman, sepertinya ini:
Bagian data yang mengikat, izinkan saya memperkenalkannya secara singkat kepada Anda, yaitu menggunakan template thymleaf untuk mengikat. Saat mengakses halaman di latar belakang, cukup tetapkan nilai model.
/ *** Penugasan atribut**/ private void setModel (pengguna pengguna, model model) {long currentUserId = getUserId (); Long VisitUserId = user.getId (); // apakah itu sendiri boolean iSself = currentUserId == visitUserId; // Apakah kedua pengguna sudah menjadi teman Boolean isfriend = groupservice.isfriend (CurrentUserId, VisitUserID); Peta <String, Object> usermap = hashmap baru <> (8); usermap.put ("avatar", user.getavatar ()); usermap.put ("name", user.getusername ()); usermap.put ("addTime", timeutil.FormatDate (user.getCreateat ())+"gabung"); if (user.getSign () == null || user.getSign (). length () == 0) {usermap.put ("tanda", ""); } else {usermap.put ("tanda", "(" + user.getSign () + ")"); } usermap.put ("uid", user.getId ()); usermap.put ("self", isself || isfriend); model.addattribute ("pengguna", usermap); }Kemudian, pada halaman, ekstrak data dari model.
<div style = "latar belakang-gambar: url ();"> <input type = "hidden" th: value = "$ {user.uid}" id = "visituid"/> <img src = "" th: src = "$ {user.avatar}" th: alt = "$ {User.name}"/<User.avatar} "th: alt =" $ {User.name} "/ TH: Text = "$ {User.Name}"> </p> <i> </i> </h1> <p> <!-<i> </i> <span style = "Color: #ff7200;"> 67206flying ciuman </span>-> </i> <span tH: text = "$ {$ {adad. <!-<i> </i> <span> dari hangzhou </span>-> <i th: if = "$ {user.self == false}"> </i> <a lay-event = "addFriend" href = "#" rel = "eksternal nofollow" th: if = "$ {User.self == false}"> Tambah eksternal a ollower " Th: Text = "$ {User.Sign}"> </p> </div>OK, di atas adalah persiapan sederhana. Jika Anda ingin mengetahui kode terperinci, Anda dapat mencarinya di akhir artikel.
Memulai aplikasi teman
Mari kita ikuti analisis bisnis Layim terlebih dahulu. Pertama -tama, kita perlu tahu siapa (toid) yang ingin kita tambahkan sebagai teman. Kemudian tambahkan komentar. Tidak apa -apa untuk menyerahkan hal -hal ini ke backend. Untuk menghindari kueri tabel, saya telah membuat nama pengguna dan avatar pengguna yang berlebihan untuk menyimpan pesan sistem. Tabel ini terutama berisi bidang: ID pengguna, avatar pengguna, nama pengguna, ID pengguna yang diterapkan, waktu aplikasi, jenis aplikasi, catatan, baca, dan atribut lainnya.
Oleh karena itu, sangat mudah untuk memulai aplikasi teman. Ini adalah fungsi tambahan. Front-end melewati ID pengguna dan aplikasi aplikasi responden. Back-end mengatur data yang akan dimasukkan ke dalam database. Kodenya adalah sebagai berikut:
/ *** Kirimkan aplikasi teman**/ public jsonResult saveFriendApply (long toid, string commise) {commise = htmlutils.htmlescape (komentar); Pengguna ContextUser = shiroutil.getCurrentUser (); long userid = long.parselong (user.getUserId ()); int record = applyrepository.countbytoidanduidandtypeandResult (toid, userid, applyType.friend, 0); if (record> 0) {return jsonresult.fail ("setelah diterapkan"); } Apply apply = new apply (); apply.setType (applyType.friend); apply.settoid (toid); apply.setremark (komentar); apply.setuid (userid); apply.setAvatar (user.getavatar ()); apply.setname (user.getUserName ()); apply.setread (false); apply.setresult (0); return SaveApply (berlaku); }Oke, aplikasinya sudah berakhir, apa yang akan kita lakukan selanjutnya? Itu benar, beri tahu pihak lain, hei, saya telah mengirimi Anda aplikasi dan memprosesnya dengan cepat. Saya telah mengalami masalah di sini. Karena program Springboot menempati Port 8080, dan T-IO menempati Port 8888, yaitu, jika saya ingin secara aktif menghubungi dorongan layanan 8888 dalam bisnis Port 8080, saya tidak tahu cara mendapatkan konteks saluran yang sesuai. Namun, setelah bertanya kepada penulis, masalah saya diselesaikan dalam satu kalimat.
Dapatkan ServerGroupContext dan masalahnya terpecahkan.
Bean LayimWebsocketStarter terdaftar ketika program sebelumnya dimulai. Jadi, jika Anda bisa mendapatkannya di sisi bisnis 8080, tidak akan ada masalah.
Dapatkan LayimWebsocketStarter, Anda bisa mendapatkan ServerGroupContext, dan kemudian Anda dapat secara aktif mendorongnya di server.
Tentu saja, hal ini mungkin belum dikembangkan, dan saya tidak memahami masalah di atas dengan baik. Itu tidak masalah. Sebenarnya, saya ingin menjelaskan bahwa jika Anda secara aktif mendorong pesan ke klien dari sisi server, cukup gunakan ServerGroupContext.
Dorongan aktif di server
Kode berikut ada di com.fyp.layim.im.common.util.pushutil
Oke, ikuti langkah -langkah di atas.
Langkah pertama adalah mendapatkan LayimWebsocketStarter.
/*** Dapatkan starter*/private static layimwebsocketstarter getStarter () {return (layimwebsocketstarter) springutil.getbean ("layimwebsocketstarter"); }Langkah 2: Dapatkan ServerGroupContext
Private Static ServerGroupContext GetServerGroupContext () {return getStarter (). GetServerGroupContext (); }Langkah ketiga adalah mendapatkan ChannelContext.
/ ** * Get channelContext * */ private static channelContext getChannelContext (String toID) {serverGroupContext context = getservergroupContext (); // Temukan User ChannelContext ChannelContext = Context.Users.Find (Context, ToID); return channelContext; }Langkah keempat adalah meluncurkan, dan kode di sini hampir sama dengan bagian kode dalam obrolan. Bagian inti adalah untuk mendapatkan ChannelContext dan kemudian mengirimkannya pesan. Jika Anda tidak online, jangan khawatir.
/ *** Server secara aktif mendorong pesan**/ public static void pushapplymessage (String toid) {logger.info ("Execute to Send Metode: PushAppLyMessage"); Layimtoclientnoticemsgbody body = Layimtoclientnoticemsgbody baru (); ChannelContext channelContext = getChannelContext (TOID); // Pertama -tama tentukan apakah itu online, lalu query database untuk mengurangi jumlah kueri IF (channelContext! = Null &&! ChannelContext.isclosed ()) {int count = getApplyService (). GetUnreadmsgCount (long.parselong (toid)); body.setCount (Count); push (channelContext, body); }} / *** Server secara aktif mendorong pesan** / private static void push (channelContext channelContext, objek msg) {coba {wsresponse response = bodyconvert.getInstance (). ConvertTotextresponse (msg); Aio.send (ChannelContext, Response); } catch (ioException ex) {}}Sekarang dorongan dilakukan, lalu kapan akan didorong? Karena dorongan pesan dalam sistem ini tidak perlu begitu instan, saya melihat dan menemukan bahwa ada mekanisme peristiwa serupa di Springboot, jadi ApplyEvent lahir.
kelas publik ApplyEvent memperluas ApplicationEvent {public applyEvent (sumber objek) {super (sumber); } private long toid; publik long gettoid () {return toid; } public applyEvent (sumber objek, long toid) {super (sumber); this.toid = toid; }}Buat pendengar untuk mendengarkan acara.
kelas publik ApplyListener mengimplementasikan ApplicationListenener <PlainingEvent> {private Logger Logger = LoggerFactory.getLogger (ApplyListener.class); @Override public void onApplicationEvent (ApplyEvent applyEvent) {new thread () {public void run () {long toid = applyEvent.gettoid (); // Di sini kita akan memanggil dorongan di atas pushutil.pushapplymessage (toid.tostring ()); } }.awal(); }}Namun, saya memiliki pertanyaan dan menemukan bahwa eksekusi dalam pendengar adalah sinkron. Kemudian, menambahkan @Async dan @enableAsync tidak berguna, jadi saya menggunakan utas baru (). Start () untuk mencapai asinkron untuk memastikan bahwa itu tidak mempengaruhi proses aplikasi utama. (Ini pertanyaan, saya belum menemukannya)
Akhirnya, jangan lupa untuk menambahkan pendengar saat aplikasi dimulai.
public static void main (string [] args) {springApplication springApplication = new springApplication (layimapplication.class); / *** Hanya ketika pendengar ditambahkan di sini akan pemicu pendengar* ApplyListener adalah peristiwa yang mendengarkan aplikasi teman**/ springapplication.addlisteners (new ApplyListener ()); springapplication.run (args); }Jahitan fungsional
Itu akan segera berhasil. Kami merangkai acara dan menerbitkan acara setelah aplikasi teman berhasil.
/*** Aplikasi teman**/@postmapping (value = "/apply-friend") public jsonResult berlaku (@RequestParam ("toid") long toid,@requestParam ("komentar") komentari string) {JSONRESULT hasil = applyService.SaveFriendlePly (toid, prajurit); // Aplikasi berhasil, acara aplikasi diposting, beri tahu TOID untuk memproses pesan. Jika tidak online, itu tidak akan diproses jika (result.issuccess ()) {applicationContext.publishevent (baru ApplyEvent ("Apply", toid)); } hasil pengembalian; }Demonstrasi fungsional
Saya telah banyak bicara, izinkan saya menunjukkan efek dari produk jadi. (Adegan Pengguna: Xiaoniao menambahkan kaisar sebagai teman, kaisar menerima pesan dan memeriksanya)
Kaisar menerima pesan dan nomor kecil 4 di sudut kiri bawah muncul. (Panggil metode layim.msgbox (msgcount))
Kaisar mengklik kotak pesan:
Kaisar menerima aplikasi dari empat selir kesayangannya dan tidak dapat tidur atau makan. Apa yang akan dia lakukan? Jika Anda ingin tahu apa yang terjadi selanjutnya, harap dengarkan kerusakan berikutnya ~~~
Meringkaskan
Artikel ini terutama memperkenalkan implementasi proses penambahan teman.
Alamat kode dalam artikel: https://github.com/fanpan26/springbootlayim
http://xiazai.vevb.com/201712/yuanma/springbootlayim-master.rar
Di atas adalah Springboot+Layim+T-IO yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!