У меня есть программа для отправки сообщений между потоком (gameengine) и другими потоками (игроками), используя rabbitmq 3.7 в java.Я использую Ubuntu 19.04.Протокол выглядит следующим образом: - игровой движок информирует о начале игры [игроки не отвечают назад]
Затем бесконечно (в соответствии с некоторыми критериями, которые я могу изменить) - игровой движок отправляет состояние игры [каждыйигрок отвечает действием, которое он выбирает или выбирает для прохождения]
Я замечаю, что после двух шагов приложение застревает на игровом движке, который получает действия игроков (и выводит их оценки), но после этого ничего не делает, что не нормально.Можете ли вы помочь мне, пожалуйста
//game engine
@Override
public void run() {
try {
initialiseSetOfActions();
initialiseSetOfPolicies();
initialiseStateOfGame();
initialiseScores();
String EXCHANGE_NAME = "cybergame_gameengine";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "direct");
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println("Game engine Waiting for the messages.........on queue " + queueName);
Message msg = new Message();
msg.setFrom("gameEngine");
msg.setTo("players");
msg.setHeader("inform-game-on");
msg.setContent("inform-game-on");
sendBulk(msg);
msg.setHeader("inform-state");
PropositionalFormula state_of_game = new Conjunction(stateOfGame);
msg.setContent(state_of_game.toString());
msg.ticks +=1;
msg.msgNo +=1;
sendBulk(msg);
msg.ticks +=1;
msg.msgNo +=1;
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("Game engine Received: " + Message.fromJSON(message).toString());
if (Message.fromJSON(message).content.toString().contentEquals("pass")) {
System.out.println("Player "+ Message.fromJSON(message).from + " decided to pass");
}
else {
Action selectedAction = actionMap.get(Message.fromJSON(message).content);
updateStateOfGame(selectedAction);
updateScore(Message.fromJSON(message).from, selectedAction);
System.out.println("Player " + Message.fromJSON(message).from + " new score is " + scoreMap.get(Message.fromJSON(message).from).toString());
}
};
while (!setOfActions.isEmpty()) {
Queue.DeclareOk feedback = channel.queueDeclarePassive(queueName);
if (feedback.getMessageCount() == playerMap.size()) {
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
System.out.println(stateOfGame.toString() + " is state of game");
state_of_game = new Conjunction(stateOfGame);
msg.setContent(state_of_game.toString());
sendBulk(msg);
msg.ticks += 1;
msg.msgNo +=1;
}
}
}
catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}
//player
public void run() {
try {
String EXCHANGE_NAME = "cybergame_players";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println(this.playerName + ": "+ "Waiting for the messages.........on queue " + queueName);
Message msg = new Message();
msg.setFrom(this.playerName);
msg.setTo("gameEngine");
msg.setHeader("action");
msg.setContent("pass");
msg.ticks =0;
msg.msgNo =0;
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(this.playerName + " Received: " + Message.fromJSON(message).toString());
if (Message.fromJSON(message).header.toString().contentEquals("inform-game-on")) {
//System.out.println(this.playerName +": just an information, i do nothing");
}
else {
if (Message.fromJSON(message).ticks != msg.ticks) {
msg.setContent("pass");
}
else {
System.out.println("In the situation where game content is not <<inform-game-on>> and ticks coincide");
PlParser parser = new PlParser();
PropositionalFormula state_of_game = (PropositionalFormula) parser.parseFormula(Message.fromJSON(message).content.toString());
Set<Action> availableActions = availableActions(setOfActions, state_of_game.getLiterals());
int actionSize = availableActions.size();
List<Action> listactions = new ArrayList<Action>(availableActions);
Random rand = new Random();
int numChoice = rand.nextInt(actionSize);
Action action = listactions.get(numChoice);
msg.setContent(action.actionName.getName().toString());
}
}
try {
sendSingle(msg);
msg.ticks += 1;
msg.msgNo +=1;
}
catch (Exception e){
}
};
while (!setOfActions.isEmpty()) {
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
}
}
catch (Exception e) {
System.out.println("Error: " + e.toString());
}
}
Вывод примерно такой:
Движок игры Ожидание сообщений ......... в очереди amq.gen-Y6vvpni5ezATWVOxH6qFIw agent_0: Ожидание сообщений ......... в очереди amq.gen-SzSOxQuG1q2ZdOLiE8-bag Сообщение отправлено: Сообщение №: 0 От: gameEngine To: Players Заголовок: inform-game-on Содержимое: inform-game-on Тиков: 0 agent_0 Получено: № сообщения: 0 От: gameEngine To: игроки Заголовок: inform-game-on Содержимое: inform-game-on Тиков: 0 Сообщение отправлено: Сообщение №: 1 От: gameEngine To:игроки Заголовок: inform-state Содержимое: start Тиков: 1 Сообщение отправлено: № сообщения: 0 От: agent_0 Кому: gameEngine Заголовок: action Содержимое: pass Тиков: 0 agent_0 Получено: Сообщение №: 1 От: gameEngine To: Players Header:Содержимое inform-state: start Тиков: 1 В ситуации, когда игровой контент не <> и тики совпадают [start] - это состояние игры. Движок игры: Получено: No сообщения: 0 От: agent_0 To: gameEngine Заголовок: action Content: pass Ticks: 0 Player agent_0 решил пройти Сообщение отправлено: Сообщение №: 1 От: agent_0 Кому: gameEngine Заголовок: action Содержимое: C Галочки: 1 Сообщение отправлено: Сообщение No: 2 От: gameEngine To: Players Заголовок: inform-state Содержимое: началоТиков: 2 agent_0 Получено: № сообщения: 2 От: gameEngine To: игроки Заголовок: inform-state Содержимое: start Тиков: 2 Игровой движок Получено: Сообщение №: 1 От: agent_0 To: gameEngine Заголовок: action Содержание: C Тиков: 1В ситуации, когда игровой контент не <> и тики совпадают. Player agent_0 новый счет равен 7 Сообщение отправлено: Сообщение №: 2 От: agent_0 Кому: gameEngine Заголовок: action Содержимое: TreatSensitiveFolder Тиков: 2 Получен игровой движок: Сообщение №: 2От: agent_0 Кому: gameEngine Заголовок: action Содержание: TreatSensitiveFolder Тиков: 2 Игрок agent_0 новый счет - 16.
Как я уже говорил ранее, я ожидал, что это будет работать непрерывно.