DefaultExchangeRegistry.registerExchange() has a side effect of calling messageStore.createExchange.
This behaviour is unexpected as DefaultQueueRegistry does not do the same for queues.
The problem that this has is that on MessageStore recovery the recovered exchanges will be registered. Which after the MessageStore has been recovered will cause createExchange to be called. The problem here is that the createExchange interface is not designed to cope with duplicates. Something that Derby highlights as it throws primary key constraint violation error.
The solution is to decouple register and create as has been done with queues. This has not previously been seen as a) the Derby test profile is not run as often and b) the configuration used did not have an additional durable exchange defined.