現在ロングポーリングを用いてSNSアプリケーションを作れないかと考えています
しかし下記のコードでは全てのメッセージを対象にした更新は出来てもユーザーごとに異なったレスポンス、例えば
あるユーザーがフォローしている相手のコメントを選別して返すというようなことは出来ません
そこでデータベースへの問い合わせにユーザー情報を付随させる、或いはデータベースから取得した情報をユーザーごとに
フィルタリングする方法などがあれば教えてください
なおロングポーリングの手法はこちらの"Comet(ロングポーリング) 非同期"のサンプルを参考にしました
java
1package servlet; 2 3import java.io.IOException; 4import java.io.PrintWriter; 5import java.util.ArrayList; 6import java.util.HashMap; 7import java.util.List; 8import java.util.Map; 9import java.util.Timer; 10import java.util.TimerTask; 11import java.util.concurrent.CopyOnWriteArrayList; 12 13import javax.servlet.AsyncContext; 14import javax.servlet.ServletConfig; 15import javax.servlet.ServletException; 16import javax.servlet.annotation.WebServlet; 17import javax.servlet.http.HttpServlet; 18import javax.servlet.http.HttpServletRequest; 19import javax.servlet.http.HttpServletResponse; 20import javax.servlet.http.HttpSession; 21 22import com.fasterxml.jackson.databind.ObjectMapper; 23 24import dao.CommentDAO; 25import model.ActiveUser; 26import model.CommentSet; 27 28 29@WebServlet(name = "UpdateMessage", urlPatterns = { "/UpdateMessage" }, asyncSupported = true) 30public class UpdateMessage extends HttpServlet { 31 private static final long serialVersionUID = 1L; 32 int count; 33 List<AsyncContext> queue = new ArrayList<>(); 34 35 public void init(ServletConfig config) throws ServletException { 36 super.init(); 37 //5秒ごとに更新 38 Timer timer = new Timer(); 39 TimerTask task = new TimerTask() { 40 @Override 41 public void run() { 42 count++; 43 //新着メッセージをDBから取得 44 CommentDAO commentDAO = new CommentDAO(); 45 List<Map<String, String>> result = commentDAO.selectNewComment(); 46 broadcast(result); 47 } 48 }; 49 timer.schedule(task, 5000, 5000); 50 } 51 52 synchronized public void broadcast(List<Map<String, String>> result) { 53 CopyOnWriteArrayList<AsyncContext> target = new CopyOnWriteArrayList<>(queue); 54 synchronized (queue) { 55 queue = new ArrayList<>(); 56 } 57 for(AsyncContext context : target) { 58 HttpServletResponse response = (HttpServletResponse) context.getResponse(); 59 response.setContentType("application/json"); 60 try { 61 ObjectMapper mapper = new ObjectMapper(); 62 String json = mapper.writeValueAsString(result); 63 System.out.println(json); 64 response.setContentType("application/json;charset=UTF-8"); 65 PrintWriter writer = response.getWriter(); 66 writer.print(json); 67 writer.close(); 68 context.complete(); 69 } catch(IOException e) { 70 e.printStackTrace(); 71 } 72 } 73 } 74 75 @Override 76 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 77 try { 78 final AsyncContext context = request.startAsync(); 79 queue.add(context); 80 }catch(IllegalStateException e) { 81 e.printStackTrace(); 82 } 83 } 84}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。