私はSpring-MVCアプリケーションに取り組んでおり、SOのユーザーのおかげで、すでにCometdチャット機能が機能しています。アプリケーションにあるもう 1 つの機能は通知ですが、Facebook のように、発生したらすぐにリアルタイム通知を統合したいと考えています。
基本的には、新しい通知が作成されるたびにデータベースに保存され、バックエンドからのその情報は、各ユーザーの一意のチャネルでログインしているユーザーの通知に渡される必要があります。
通知をチャット クラスにルーティングするには、いくつかの作業が必要になるため、このアプローチが機能するかどうかを知りたいと思います。ChatServiceImpl クラスのインターフェースも持っていないことに注意してください。それは大丈夫ですか?十分な話ですが、コードは次のとおりです。
ChatServiceImpl :
@Named
@Singleton
@Service
public class ChatServiceImpl {
@Inject
private BayeuxServer bayeux;
@Session
private ServerSession serverSession;
public void sendNotification(Notification notification,int id
// And then I send notification here like below, by extracting information from the notification object.
ServerChannel serverChannel = bayeux.createChannelIfAbsent("/person/notification/" + id).getReference();
serverChannel.setPersistent(true);
serverChannel.publish(serverSession, output);
}
}
上記のクラスにはインターフェースがないため、次のようにメソッドを使用する予定でした:
@Service
@Transactional
public class GroupCanvasServiceImpl implements GroupCanvasService{
private ChatServiceImpl chatService;
public void someMethod(){
chatService.sendNotification(notification, id);
}
}
BayeuxInitializer :
@Component
public class BayeuxInitializer implements DestructionAwareBeanPostProcessor, ServletContextAware
{
private BayeuxServer bayeuxServer;
private ServerAnnotationProcessor processor;
@Inject
private void setBayeuxServer(BayeuxServer bayeuxServer)
{
this.bayeuxServer = bayeuxServer;
}
@PostConstruct
private void init()
{
this.processor = new ServerAnnotationProcessor(bayeuxServer);
}
@PreDestroy
private void destroy()
{
System.out.println("Bayeux in PreDestroy");
}
public Object postProcessBeforeInitialization(Object bean, String name) throws BeansException
{
processor.processDependencies(bean);
processor.processConfigurations(bean);
processor.processCallbacks(bean);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String name) throws BeansException
{
return bean;
}
public void postProcessBeforeDestruction(Object bean, String name) throws BeansException
{
processor.deprocessCallbacks(bean);
}
@Bean(initMethod = "start", destroyMethod = "stop")
public BayeuxServer bayeuxServer()
{
return new BayeuxServerImpl();
}
public void setServletContext(ServletContext servletContext)
{
servletContext.setAttribute(BayeuxServer.ATTRIBUTE, bayeuxServer);
}
}
この方法でよろしければ教えてください。どうもありがとう。