{"record":{"id":"105fb47dd7fce2fb","repo":"floci-io/floci","slug":"conflictexception","errorCode":"ConflictException","errorMessage":"Broker already exists: \" + name","messagePattern":"Broker already exists: \" \\+ name","errorType":"http","errorClass":"AwsException","httpStatus":409,"severity":"error","filePath":"src/main/java/io/github/hectorvent/floci/services/amazonmq/AmazonMqService.java","lineNumber":99,"sourceCode":"            throw new AwsException(\"BadRequestException\",\n                    \"Only SINGLE_INSTANCE DeploymentMode is supported\", 400);\n        }\n        // RabbitMQ brokers require exactly one user at creation; that user becomes the\n        // broker's RabbitMQ administrator (seeded into the container). This mirrors AWS,\n        // which rejects CreateBroker for RabbitMQ unless exactly one user is supplied.\n        List<MqUser> requestedUsers = params.users() == null ? List.of() : params.users();\n        if (requestedUsers.size() != 1) {\n            throw new AwsException(\"BadRequestException\",\n                    \"Exactly one broker user is required for a RabbitMQ broker\", 400);\n        }\n        MqUser admin = requestedUsers.get(0);\n        if (admin.getUsername() == null || admin.getUsername().isBlank()) {\n            throw new AwsException(\"BadRequestException\", \"Broker user username is required\", 400);\n        }\n        validateUserPassword(admin.getPassword());\n\n        if (storage.scan(k -> true).stream().anyMatch(b -> name.equals(b.getBrokerName()))) {\n            throw new AwsException(\"ConflictException\", \"Broker already exists: \" + name, 409);\n        }\n\n        String brokerId = \"b-\" + UUID.randomUUID();\n        String accountId = regionResolver.getAccountId();\n        String brokerArn = AwsArnUtils.Arn.of(\"mq\", config.defaultRegion(), accountId,\n                \"broker:\" + name + \":\" + brokerId).toString();\n        String engineVersion = (params.engineVersion() == null || params.engineVersion().isBlank())\n                ? DEFAULT_ENGINE_VERSION : params.engineVersion();\n\n        Broker broker = new Broker(brokerId, brokerArn, name, ENGINE_RABBITMQ,\n                engineVersion, deploymentMode, params.hostInstanceType());\n        broker.setAccountId(accountId);\n        broker.setVolumeId(String.format(\"%06x\", new SecureRandom().nextInt(0xFFFFFF)));\n        broker.setPubliclyAccessible(params.publiclyAccessible());\n        broker.setAutoMinorVersionUpgrade(params.autoMinorVersionUpgrade());\n        if (params.users() != null) {\n            broker.setUsers(new ArrayList<>(params.users()));\n        }","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/floci-io/floci/blob/62ff490619e7bd3554597c28c704081b4c15add5/src/main/java/io/github/hectorvent/floci/services/amazonmq/AmazonMqService.java#L81-L117","documentation":"Floci keeps a per-instance registry of brokers and rejects CreateBroker when an existing broker already has the same BrokerName, returning 409 ConflictException. Broker names are unique per emulator state (unlike AWS where uniqueness is account+region scoped but effectively the same locally).","triggerScenarios":"Running CreateBroker twice with the same BrokerName without an intervening DeleteBroker; re-running a test script or integration suite against a persistent/hybrid storage mode that retained the previous broker.","commonSituations":"Test suites that create named brokers and fail before cleanup; switching storage to persistent mode so brokers survive restarts while the setup code assumes a clean slate; retries of a create call that actually succeeded server-side.","solutions":["Delete the existing broker first: aws mq delete-broker --broker-id <id>, wait for it to disappear, then recreate","Use a unique broker name per test run (e.g. suffix with a UUID or timestamp)","If persistent storage holds stale brokers from earlier runs, clean the storage path or list-and-delete existing brokers in test setup"],"exampleFix":"# before\naws mq create-broker --broker-name demo ...   # second run -> ConflictException\n# after\naws mq delete-broker --broker-id b-xxxx || true\naws mq create-broker --broker-name demo ...","handlingStrategy":"try-catch","validationCode":"boolean nameTaken = mqClient.listBrokers().brokers().stream()\n    .anyMatch(b -> name.equals(b.brokerName()));\nif (nameTaken) throw new IllegalStateException(\"Broker name already in use: \" + name);","typeGuard":null,"tryCatchPattern":"try {\n    mqClient.createBroker(req);\n} catch (ConflictException e) {\n    // idempotent create: treat existing broker as success, or delete-and-retry once\n    String id = findBrokerIdByName(name);\n    if (id == null) throw e;\n    mqClient.deleteBroker(r -> r.brokerId(id));\n    mqClient.createBroker(req);\n}","preventionTips":["Use unique broker names per test run (name + UUID suffix)","Clean up brokers in @AfterEach to avoid leaking state into the next run"],"tags":["amazonmq","create-broker","conflict","duplicate","state"],"backgroundTag":null,"analyzedSha":"62ff490619e7bd3554597c28c704081b4c15add5","analyzedAt":"2026-08-14T14:25:23.764Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}