package org.infosec.ismp.manager.direct;
import java.io.IOException;
import java.io.Serializable;
import java.net.InetAddress;
import java.util.UUID;
import org.infosec.ismp.model.event.Event;
import org.infosec.ismp.util.ThreadCategory;
import org.opennms.protocols.rt.IDBasedRequestLocator;
import org.opennms.protocols.rt.RequestTracker;
/**
* 用于发送直接请求
* @author lianglin
*
*/
public class DirectRequestSender {
private RequestTracker<DirectRequest, DirectReply> s_commandTracker;
public JMSSocket jmsSocket;
public void sendEvent(InetAddress host, int port, Event event,
long timeout, DirectResponseCallback cb) throws Exception {
initialize();
DirectRequest request = new DirectRequest(host, port, event,
timeout,cb);
s_commandTracker.sendRequest(request);
}
public Serializable sendEvent(InetAddress host,int port,Event event,long timeout){
String uuid = event.getUuid();
if(uuid==null){
uuid = UUID.randomUUID().toString();
event.setUuid(uuid);
}
SingleDirectResponseCallback cb = new SingleDirectResponseCallback(host, port);
try {
sendEvent(host, port, event,timeout,cb);
cb.waitFor();
} catch (Exception e) {
log().warn("发送事件出错", e);
}
if(uuid.equals(cb.getUuid())){
return cb.getResult();
}else{
return null;
}
}
public void setJmsSocket(JMSSocket jmsSocket) {
this.jmsSocket = jmsSocket;
}
static ThreadCategory log(){
return ThreadCategory.getInstance(DirectRequestSender.class.getName());
}
/**
* Initializes this singleton
*/
public synchronized void initialize() throws IOException {
if (s_commandTracker != null)
return;
s_commandTracker = new RequestTracker<DirectRequest, DirectReply>(
"DirectCommand",
new DirectMessenger(jmsSocket),
new IDBasedRequestLocator<DirectRequestId, DirectRequest, DirectReply>());
s_commandTracker.start();
}
}