在使用Java api对接路透系统,通过consumer.registerClient(xxx)发消息过程中,出现了死锁的问题,查看了ema的jar包源码,发现在ema对消息处理过程中对线程上了jdk的锁,没有释放该锁导致线程阻塞,从而导致容器崩溃,下面附上代码,还请帮忙解惑
try
{//args为ric和serviceName的映射关系
Iterable<Map.Entry<String,String>> it = args.entrySet().iterator;
while(it.hasNext()){
Map.Entry<String,String> entry = it.next();
List<String> list = Array.asList(entry.getValue().split(";"));
for(String ric : list){
consumer.registerClient( EmaFactory.createReqMsg().serviceName(entry.getKey()).name(ric), appClient, 0);
}
}
}
catch (OmmException excp)
{
System.out.println(excp.getMessage());
}
项目启动时创建appClient和ommConsumer @Bean public AppClient creatOmmconsumerClient(){ AppClient appClient = new AppClient(); return appClient; } @Bean public OmmConsumer creatOmmConsumer(){ try{ OmmConsumerConfig config = EmaFactory.createOmmConsumerConfig(); OmmConsumer consumer = EmaFactory.createOmmConsumer(config.host(hostName).username(userName)); return consumer; }catch (Exception e){ e.printStackTrace(); OmmConsumer consumer = new OmmConsumer() { @Override public String consumerName() { return null; } @Override public long registerClient(ReqMsg reqMsg, OmmConsumerClient client) { return 0; } @Override public long registerClient(ReqMsg reqMsg, OmmConsumerClient client, Object closure) { return 0; } @Override public long registerClient(ReqMsg reqMsg, OmmConsumerClient client, Object closure, long parentHandle) { return 0; } @Override public long registerClient(TunnelStreamRequest tunnelStreamRequest, OmmConsumerClient client) { return 0; } @Override public long registerClient(TunnelStreamRequest tunnelStreamRequest, OmmConsumerClient client, Object closure) { return 0; } @Override public void reissue(ReqMsg reqMsg, long handle) { } @Override public void submit(GenericMsg genericMsg, long handle) { } @Override public void submit(PostMsg postMsg, long handle) { } @Override public long dispatch() { return 0; } @Override public long dispatch(long timeOut) { return 0; } @Override public void unregister(long handle) { } @Override public void uninitialize() { } @Override public void channelInformation(ChannelInformation ci) { } @Override public void modifyIOCtl(int code, int value) { } @Override public void renewOAuthCredentials(OAuth2CredentialRenewal credentials) { } } } }
ema报错的代码如下标粗斜体;异常捕获如上图 protected long registerClient(ReqMsg reqMsg, T client, Object closure) { if(checkClient(client)) return 0; try { _userLock.lock(); long handle = _itemCallbackClient != null ? _itemCallbackClient.registerClient(reqMsg, client, closure, 0) : 0; return handle; } finally { _userLock.unlock(); } }