package com.opensoc.dataservices.websocket;
import java.io.IOException;
import java.util.Properties;
import java.util.UUID;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opensoc.dataservices.kafkaclient.KafkaClient;
@WebSocket(maxTextMessageSize = 64 * 1024)
public class KafkaMessageSenderSocket
{
private static final Logger logger = LoggerFactory.getLogger( KafkaMessageSenderSocket.class );
// config Properties object for our zooKeeper URL, etc. here
private Properties configProps;
boolean authGood = false;
int threads = 1;
KafkaClient client;
public KafkaMessageSenderSocket( Properties configProps, final boolean authGood )
{
this.configProps = configProps;
this.authGood = authGood;
}
@OnWebSocketConnect
public void onConnect( Session session )
{
logger.info( "WebSocket connected!" );
}
@OnWebSocketClose
public void onClose( Session session, int closeCode, String closeReason )
{
logger.info( "WebSocket closed. Shutting down Kafka client." );
client.shutdown();
}
@OnWebSocketMessage
public void onMessage( Session session, String text )
{
if( !authGood )
{
try
{
session.getRemote().sendString( "Must login first" );
}
catch (IOException e) {
logger.error( "Unexpected error sending to remote", e );
}
return;
}
logger.debug( "WebSocket TEXT message received: " + text );
String msg = text.trim();
if( msg.startsWith( "startMessages" ))
{
String zooKeeperHost = configProps.getProperty( "kafkaZookeeperHost" );
logger.info( "kafkaZookeeperHost: " + zooKeeperHost );
String zooKeeperPort = configProps.getProperty( "kafkaZookeeperPort" );
logger.info( "kafkaZookeeperPort: " + zooKeeperPort );
String groupId = null; // configProps.getProperty( "kafkaGroupId" );
String topic = configProps.getProperty( "kafkaTopicName" );
logger.info( "kafkaTopic: " + topic );
// try to parse out a groupID. If one exists, use it. If not
// generate a new one and return to the client.
if( msg.contains( ":" ))
{
String[] parts = msg.split( ":" );
groupId = parts[1];
}
else
{
groupId = UUID.randomUUID().toString();
try
{
session.getRemote().sendString( "groupId:" + groupId );
}
catch( IOException e )
{
throw new RuntimeException( e );
}
}
System.out.println( "using groupId: " + groupId );
client = new KafkaClient(zooKeeperHost + ":" + zooKeeperPort, groupId, topic, session.getRemote() );
client.run(threads);
}
else if( msg.equals( "stopMessages" ))
{
client.shutdown();
}
else
{
logger.error("Received invalid message from remote: " + text );
}
}
@OnWebSocketMessage
public void onMessage( Session session, byte[] buff, int offset, int length )
{
logger.info( "WebSocket BINARY message received!" );
}
}