Java 传入消息在Azure服务总线主题订阅的侦听器之间分配
我使用以下来自Microsoft portal的代码从Azure服务总线主题/订阅发送和接收消息。代码运行良好。总线当我运行2个接收器代码实例时,消息将在2个接收器之间分配。10发送和接收各5个。我只想知道如何在所有接收者中获取所有消息Java 传入消息在Azure服务总线主题订阅的侦听器之间分配,java,azureservicebus,azure-servicebus-topics,azure-servicebus-subscriptions,Java,Azureservicebus,Azure Servicebus Topics,Azure Servicebus Subscriptions,我使用以下来自Microsoft portal的代码从Azure服务总线主题/订阅发送和接收消息。代码运行良好。总线当我运行2个接收器代码实例时,消息将在2个接收器之间分配。10发送和接收各5个。我只想知道如何在所有接收者中获取所有消息 public class ServiceBusTopicSender { static final Gson GSON = new Gson(); public static void main(String[] args) throws Exce
public class ServiceBusTopicSender
{
static final Gson GSON = new Gson();
public static void main(String[] args) throws Exception, ServiceBusException {
// TODO Auto-generated method stub
TopicClient sendClient;
String connectionString = "Endpoint=sb://basicbus.servicebus.windows.net/;"
+ "SharedAccessKeyName=RootManageSharedAccessKey;"
+ "SharedAccessKey=xxxxxpxxxxxxxxxxxxxxxxxx/xxxxxxxxxx=";
sendClient = new TopicClient(new ConnectionStringBuilder(connectionString, "basictopic"));
sendMessagesAsync(sendClient).thenRunAsync(() -> sendClient.closeAsync());
}
static CompletableFuture<Void> sendMessagesAsync(TopicClient sendClient) {
List<HashMap<String, String>> data =
GSON.fromJson(
"[" +
"{'name' = 'Einstein', 'firstName' = 'Albert'}," +
"{'name' = 'Heisenberg', 'firstName' = 'Werner'}," +
"{'name' = 'Curie', 'firstName' = 'Marie'}," +
"{'name' = 'Hawking', 'firstName' = 'Steven'}," +
"{'name' = 'Newton', 'firstName' = 'Isaac'}," +
"{'name' = 'Bohr', 'firstName' = 'Niels'}," +
"{'name' = 'Faraday', 'firstName' = 'Michael'}," +
"{'name' = 'Galilei', 'firstName' = 'Galileo'}," +
"{'name' = 'Kepler', 'firstName' = 'Johannes'}," +
"{'name' = 'Kopernikus', 'firstName' = 'Nikolaus'}" +
"]",
new TypeToken<List<HashMap<String, String>>>() {
}.getType());
List<CompletableFuture> tasks = new ArrayList<>();
for (int i = 0; i < data.size(); i++) {
final String messageId = Integer.toString(i);
Message message = new Message(GSON.toJson(data.get(i), Map.class).getBytes(UTF_8));
message.setContentType("application/json");
message.setLabel("Scientist");
message.setMessageId(messageId);
message.setTimeToLive(Duration.ofMinutes(2));
System.out.printf("Message sending: Id = %s\n", message.getMessageId());
tasks.add(
sendClient.sendAsync(message).thenRunAsync(() -> {
System.out.printf("\tMessage acknowledged: Id = %s\n", message.getMessageId());
}));
}
return CompletableFuture.allOf(tasks.toArray(new CompletableFuture<?>[tasks.size()]));
}
}
公共类服务BustopicSender
{
静态最终Gson Gson=新Gson();
公共静态void main(字符串[]args)引发异常,ServiceBusException{
//TODO自动生成的方法存根
主题客户端发送客户端;
String connectionString=“Endpoint=sb://basicbus.servicebus.windows.net/;”
+“SharedAccessKeyName=RootManageSharedAccessKey;”
+“SharedAccessKey=XXXXX PXXXXXXXXXXXXXXX/XXXXXXXXX=”;
sendClient=newtopicclient(newconnectionstringbuilder(connectionString,“basictopic”);
sendMessagesAsync(sendClient).thenRunAsync(()->sendClient.closeAsync());
}
静态CompletableFuture sendMessagesAsync(TopicClient sendClient){
列表数据=
GSON.fromJson(
"[" +
{'name'='Einstein','firstName'='Albert'}+
“{'name'='Heisenberg','firstName'='Werner'}”+
“{'name'='Curie','firstName'='Marie'}”+
“{'name'='Hawking','firstName'='Steven'},”+
{'name'='Newton','firstName'='Isaac'}+
“{'name'='Bohr','firstName'='Niels'}”+
“{'name'='Faraday','firstName'='Michael'}”+
{'name'='galiley','firstName'='Galileo'}+
“{'name'='Kepler','firstName'='Johannes'}”+
{'name'='Kopernikus','firstName'='Nikolaus'}+
"]",
新的TypeToken(){
}.getType());
列表任务=新建ArrayList();
对于(int i=0;i{
System.out.printf(“\t消息已确认:Id=%s\n”,message.getMessageId());
}));
}
返回CompletableFuture.allOf(tasks.toArray(新的CompletableFuture[tasks.size()]);
}
}
-----------------------------------------------------------------------------
公共类服务BustopCrecever
{
静态最终Gson Gson=新Gson();
公共静态void main(字符串[]args)引发异常,ServiceBusException{
String connectionString=“Endpoint=sb://basicbus.servicebus.windows.net/;”
+“SharedAccessKeyName=RootManageSharedAccessKey;”
+“SharedAccessKey=XXXXX PXXXXXXXXXXXXXXX/XXXXXXXXX=”;
SubscriptionClient subscription1Client=新的SubscriptionClient(新连接String Builder(连接字符串,
“basictopic/subscriptions/basicsubscription”),ReceiveMode.PEEKLOCK);
registerMessageHandlerOnClient(订阅1客户端);
}
静态无效注册表MessageHandlerOnClient(SubscriptionClient receiveClient)引发异常{
//注册RegisterMessageHandler回调
IMessageHandler messageHandler=新的IMessageHandler(){
//当消息处理程序循环获得消息时调用回调
公共CompletableFuture onMessageAsync(IMessage消息){
//接收传递给回调函数的消息
如果(message.getLabel()!=null&&
message.getContentType()!=null&&
message.getLabel().contentEquals(“科学家”)&&
message.getContentType().contentEquals(“应用程序/json”)){
byte[]body=message.getBody();
Map scientist=GSON.fromJson(新字符串(body,UTF_8),Map.class);
System.out.printf(
\n\t\t\t\t%s收到的消息:\n\t\t\t\t\t消息ID=%s\n\t\t\t\t\t序列号=%s\n\t\t\t\t\tQueuedTimeUTC=%s+
“\n\t\t\t\t\t\t\texpiresautc=%s,\n\t\t\t\t\t内容类型=\%s\,\n\t\t\t\t\t内容:[名字=%s,名字=%s]\n”,
receiveClient.getEntityPath(),
message.getMessageId(),
message.getSequenceNumber(),
message.getEnqueuedTimeUtc(),
message.getExpiresAuthc(),
message.getContentType(),
科学家!=null?科学家。获取(“名字”):“”,
科学家!=null?科学家。获取(“名称”):“”;
System.out.println(“分区键是::”+message.getPartitionKey());
}
返回receiveClient.completeAsync(message.getLockToken());
}
公共无效notifyException(可丢弃可丢弃,ExceptionPhase ExceptionPhase){
System.out.printf(exceptionPhase+“-”+throwable.getMessage());
}
};
receiveClient.registerMessageHandler(
messageHandler,
//
public class ServiceBusTopicReceiver
{
static final Gson GSON = new Gson();
public static void main(String[] args) throws Exception, ServiceBusException {
String connectionString = "Endpoint=sb://basicbus.servicebus.windows.net/;"
+ "SharedAccessKeyName=RootManageSharedAccessKey;"
+ "SharedAccessKey=xxxxxpxxxxxxxxxxxxxxxxxx/xxxxxxxxxx=";
SubscriptionClient subscription1Client = new SubscriptionClient(new ConnectionStringBuilder(connectionString,
"basictopic/subscriptions/basicsubscription"), ReceiveMode.PEEKLOCK);
registerMessageHandlerOnClient(subscription1Client);
}
static void registerMessageHandlerOnClient(SubscriptionClient receiveClient) throws Exception {
// register the RegisterMessageHandler callback
IMessageHandler messageHandler = new IMessageHandler() {
// callback invoked when the message handler loop has obtained a message
public CompletableFuture<Void> onMessageAsync(IMessage message) {
// receives message is passed to callback
if (message.getLabel() != null &&
message.getContentType() != null &&
message.getLabel().contentEquals("Scientist") &&
message.getContentType().contentEquals("application/json")) {
byte[] body = message.getBody();
Map scientist = GSON.fromJson(new String(body, UTF_8), Map.class);
System.out.printf(
"\n\t\t\t\t%s Message received: \n\t\t\t\t\t\tMessageId = %s, \n\t\t\t\t\t\tSequenceNumber = %s, \n\t\t\t\t\t\tEnqueuedTimeUtc = %s," +
"\n\t\t\t\t\t\tExpiresAtUtc = %s, \n\t\t\t\t\t\tContentType = \"%s\", \n\t\t\t\t\t\tContent: [ firstName = %s, name = %s ]\n",
receiveClient.getEntityPath(),
message.getMessageId(),
message.getSequenceNumber(),
message.getEnqueuedTimeUtc(),
message.getExpiresAtUtc(),
message.getContentType(),
scientist != null ? scientist.get("firstName") : "",
scientist != null ? scientist.get("name") : "");
System.out.println("Partition Key is ::::: " + message.getPartitionKey());
}
return receiveClient.completeAsync(message.getLockToken());
}
public void notifyException(Throwable throwable, ExceptionPhase exceptionPhase) {
System.out.printf(exceptionPhase + "-" + throwable.getMessage());
}
};
receiveClient.registerMessageHandler(
messageHandler,
// callback invoked when the message handler has an exception to report
// 1 concurrent call, messages are auto-completed, auto-renew duration
new MessageHandlerOptions(1, false, Duration.ofMinutes(1)));
}