Salut,
(cross posting to users_at_grizzly as similar question has been asked recently)
Jung-Shuo Pai wrote:
> Hi there:
>
> Currently, I am trying to upgrading our previous website running on
> TOMCAT 5.5 to a clustered environment run by Glassfish.
>
> In our application, we use the Grizzly Comet API to do the following thing:
>
>
> A Flash client requests a URL, say /Send , and we'll keep a
> connection for this client, but add a handler for the client until
> someone notify it.
>
> A software will call another URL, say /Return, and the handler for
> the Flash client will be notified.
>
> The Flash client will then receive & display a message from
> the server before the connection is closed.
>
>
> However, this application only works in single-server scenario.
>
> In clustered environment, if the Flash client request URL on server A,
> but the software request URL on server B, then the Flash client will
> never return.
>
> The typical example of Grizzly Comet API is the Chatroom application.
> But even in this application, the issue I mentioned still exists.
Right. In a clustered environment, requests that are suspended on
serverA cannot be notified by an event in server B. The proposed
solution is to use JMS in between server A and server B, and hook the
JMS listener/published using the Grizzly's NotificationHandler[1][2]. As
an example, a JMSNotificationHandler could be implemented as (warning:
last time I looked at JMS was in ...2002 so the code might be bogus :-))
When you create your CometContext, just do:
cometContext.setNotificationHandler(new JMSNotificationHandler());
[ ** Pushing Data between Server A and B ** ]
The JMS enabled NotificationHandler looks like
public class JMSNotificationHandler extends DefaultNotificationHandler{
public void notify(CometEvent cometEvent<String>, Iterator<CometHandler>
iteratorHandlers){
//(1) Notify our local CometHandler
super.notify(cometEvent,iteratorHandlers);
//(2) Notify our remote instance
// Assuming we are using JMS Topic
TopicPublisher publisher = .....;
TextMessage jmsTextMessage = ....;
// The attachment contains the message we want to push)
jmsTextMessage.setText(cometEvent.attachment());
publisher.publish(jmsTextMessage);
}
[ ** Receiving Data from Server A or B **]
public class MyJMSCometLister implements MessageListener{
public void onMessage(Message message){
TextMessage textMessage = (TextMessage) message;
CometContext myCometContext = CometEngine.getCometContext(<<your
context>>);
myCometContext.notify(message.getText());
}
}
Technically, every time a Server event (a PUSH) will occurs, all
CometHandler.onEvent() will be called independently of their location
(server A or B).
>
> Is there any possible wayI can resolve the issue happening in the
> clustered environment?
>
> Thank you for taking a look at my question.
>
> Best Regards,
Hope that help.
A+
-- Jeanfrancois
[1]
https://grizzly.dev.java.net/nonav/apidocs/index.html
[2]
http://weblogs.java.net/blog/jfarcand/archive/2007/03/new_adventures_1.html
>
> John