Java 获取EventHubException:当我创建两个EventHubClient实例时,连接中止

Java 获取EventHubException:当我创建两个EventHubClient实例时,连接中止,java,azure,azure-eventhub,Java,Azure,Azure Eventhub,这也不是重复的,因为本问题中的问题与代理有关。这不是我的代理设置的问题,因为此代码适用于单事件中心客户端 我的问题是:是否可能有一个Java应用程序向两个或多个事件中心客户端发送消息 我正在尝试将事件数据发布/发送到Azure事件中心的多个实例。 我已经设置了两个事件中心名称空间,每个名称空间都有自己的事件中心。 我在所有两个事件集线器中都有自己的连接字符串、SAS键、名称空间和名称。 由于每个事件中心名称空间在没有手动干预(服务请求)的情况下只能支持20个吞吐量单元,因此我试图找到是否可以将数

这也不是重复的,因为本问题中的问题与代理有关。这不是我的代理设置的问题,因为此代码适用于单事件中心客户端

我的问题是:是否可能有一个Java应用程序向两个或多个事件中心客户端发送消息

我正在尝试将事件数据发布/发送到Azure事件中心的多个实例。 我已经设置了两个事件中心名称空间,每个名称空间都有自己的事件中心。 我在所有两个事件集线器中都有自己的连接字符串、SAS键、名称空间和名称。 由于每个事件中心名称空间在没有手动干预(服务请求)的情况下只能支持20个吞吐量单元,因此我试图找到是否可以将数据发送到多个事件中心。 我可以看出我的代码在单事件hubclient上运行良好。当我的代码尝试创建第二个EventHubClient时,我发现这个连接异常被中止

我正在使用azure的git hub上共享的示例代码

我看到以下例外情况:

Exception in thread "main" com.microsoft.azure.eventhubs.EventHubException: connection aborted
at com.microsoft.azure.eventhubs.impl.ExceptionUtil.toException(ExceptionUtil.java:59)
at com.microsoft.azure.eventhubs.impl.MessagingFactory.onConnectionError(MessagingFactory.java:249)
at com.microsoft.azure.eventhubs.impl.ConnectionHandler.onTransportError(ConnectionHandler.java:102)
at org.apache.qpid.proton.engine.BaseHandler.handle(BaseHandler.java:191)
at org.apache.qpid.proton.engine.impl.EventImpl.dispatch(EventImpl.java:108)
at org.apache.qpid.proton.reactor.impl.ReactorImpl.dispatch(ReactorImpl.java:324)
at org.apache.qpid.proton.reactor.impl.ReactorImpl.process(ReactorImpl.java:291)
at com.microsoft.azure.eventhubs.impl.MessagingFactory$RunReactor.run(MessagingFactory.java:445)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
任何指示/输入都将受到高度赞赏。 以下是相关代码:

public class Sender {

private static final String EVENTHUB_NS1= "TT";
private static final String EVENTHUB1= "TT";
private static final String SAS_KEY_NAME1= "RootManageSharedAccessKey";
private static final String SAS_KEY_VAL1= "SECRET1";

private static final String EVENTHUB_NS2= "TT1";
private static final String EVENTHUB2= "TT1";
private static final String SAS_KEY_NAME2= "RootManageSharedAccessKey";
private static final String SAS_KEY_VAL2= "SECRET2";


private EventData getEventData(int eventDataPrefix) throws IOException, URISyntaxException {
    String msgData = "<=>"+eventDataPrefix + "<=>"+"TEST MESSAGE..";
    final Gson gson = new GsonBuilder().create();
    byte [] data =gson.toJson(msgData).getBytes(Charset.defaultCharset());
    EventData ed = EventData.create(data);
    return ed;
}
public static final int MAX_BATCH_SIZE=100;
private List<EventData> getBatchOfEvents() throws IOException, URISyntaxException {
    List<EventData> events = new ArrayList<>();
    for(int i = 0; i < MAX_BATCH_SIZE; i ++){
        events.add(getEventData(i));
    }
    return events;
}
private List<String> getConnectionStrings(){
    List<String> connStrings = new ArrayList<>();
    ConnectionStringBuilder csBldr1 = new ConnectionStringBuilder();
    csBldr1.setNamespaceName(EVENTHUB_NS1);
    csBldr1.setEventHubName(EVENTHUB1);
    csBldr1.setSasKeyName(SAS_KEY_NAME1);
    csBldr1.setSasKey(SAS_KEY_VAL1);

    ConnectionStringBuilder csbldr2 = new ConnectionStringBuilder();
    csbldr2.setNamespaceName(EVENTHUB_NS2);
    csbldr2.setEventHubName(EVENTHUB2);
    csbldr2.setSasKeyName(SAS_KEY_NAME2);
    csbldr2.setSasKey(SAS_KEY_VAL2);

    connStrings.add(csBldr1.toString());
    connStrings.add(csbldr2.toString());
    return connStrings;
}

private List<EventHubClient> getEHClients() throws IOException, EventHubException, ExecutionException, InterruptedException {

    List<EventHubClient> ehClients = new ArrayList<>();
    System.out.println("Starting getEhCLients..");

    for( String connStr: getConnectionStrings()){

        final ExecutorService executorService = Executors.newSingleThreadExecutor();
        //The second iteration of for loop gives the EventHubException
        EventHubClient client= EventHubClient.createSync(connStr, executorService);


        ehClients.add(client);
        System.out.println("EH CONNSTR::"+connStr);
    }

    return ehClients;
}


private void sendBatch( List<EventData> events) throws IOException, EventHubException, ExecutionException, InterruptedException {
    List<EventHubClient> ehClients = getEHClients();
    if( ehClients.size() <=0) {
        System.out.println("NO EH CLients.. to send..");
        return;
    }
    for(int i = 0; i < events.size();i++){
        EventData data = events.get(i);
        int ehClientIndex = i % ehClients.size();
        EventHubClient client = ehClients.get(ehClientIndex);
        client.sendSync(data);
        System.out.print("MsgSent:"+ehClientIndex);
    }
    System.out.println("\nDone");
}
public static void main(String[] args) throws IOException, URISyntaxException, EventHubException, ExecutionException, InterruptedException {
    Sender sender = new Sender();
    List<EventData> events = sender.getBatchOfEvents();
    sender.sendBatch(events);

}
公共类发送方{
私有静态最终字符串EVENTHUB\u NS1=“TT”;
私有静态最终字符串EVENTHUB1=“TT”;
私有静态最终字符串SAS_KEY_NAME1=“RootManageSharedAccessKey”;
私有静态最终字符串SAS_KEY_VAL1=“SECRET1”;
私有静态最终字符串EVENTHUB\u NS2=“TT1”;
私有静态最终字符串EVENTHUB2=“TT1”;
私有静态最终字符串SAS_KEY_NAME2=“RootManageSharedAccessKey”;
私有静态最终字符串SAS_KEY_VAL2=“SECRET2”;
private EventData getEventData(int eventDataPrefix)引发IOException、URISyntaxException{
字符串msgData=“”+eventDataPrefix+“+”测试消息..”;
final Gson Gson=new GsonBuilder().create();
byte[]data=gson.toJson(msgData).getBytes(Charset.defaultCharset());
EventData ed=EventData.create(数据);
返回ed;
}
公共静态最终整数最大批量大小=100;
私有列表getBatchOfEvents()引发IOException、URISyntaxException{
列表事件=新建ArrayList();
对于(int i=0;i如果(ehClients.size()是一个非常有趣的用例,我可以尝试从我的角度进行复制。我猜EventHubClient有一些静态字段,这些字段将由多个实例共享,这可能会导致您的问题

除此之外,我想了解为什么要使用两个名称空间,如何使用一个具有更高吞吐量的名称空间。一个名称空间就像一个集群。事实上,我来自Spring Cloud Azure,并尝试改善Azure上的Java体验。请随时尝试我们的事件中心绑定器