Spring RabbitListener与RoutingConnectionFactory

时间:2018-11-23 14:26:29

标签: java spring spring-amqp

我将models.BooleanField设置为:

class MsAccessBooleanField(models.BooleanField):
    def from_db_value(self, value, expression, connection):
        if value == -1:
            return True
        if value == 0:
            return False

    def to_python(self, value):
        if value == -1:
            return True
        if value == 0:
            return False

    def get_prep_value(self, value):

        if value == True:
            return -1
        if value == False:
            return 0
        return None

    def get_db_prep_value(self, value, connection, prepared=False):
        if value == True:
             return -1
        if value == False:
             return 0
        return None

上面的SimpleRoutingConnectionFactory使我能够按预期使用@Bean @Primary public SimpleRoutingConnectionFactory routingConnectionFactory(ConnectionFactory cf1, ConnectionFactory cf2) { SimpleRoutingConnectionFactory rcf = new SimpleRoutingConnectionFactory(); Map<Object, ConnectionFactory> map = new HashMap<>(); map.put("[foo.server1,bar.server1]", cf1); // receive map.put("[foo.server2,bar.server2]", cf2); // receive map.put("server1", cf1); // send map.put("server2", cf2); // send rcf.setTargetConnectionFactories(map); rcs.setDefaultConnectionFactory(defaultConnectionFactory()); return rcf; } 在特定服务器上发送消息,但接收却没有。

然后,我手动注册了一个RoutingConnectionFactory队列,该队列在SimpleResourceHolder.bind(rabbitTemplate().getConnectionFactory(), host)队列上侦听。

我希望看到MessageListenerContainer为发送到foo.server1,bar.server1,foo.server2,bar.server2的消息创建的频道和cf1为发送到foo.server1的消息创建的频道,但是该频道似乎由cf2创建。

但是,我可以在调试日志中看到: bar.server2

这意味着defaultConnectionFactory对所有队列都使用单个Cannot determine target ConnectionFactory for lookup key [[foo.server1,bar.server1,foo.server2,bar.server2]]?我可以以某种方式将侦听器配置为对每个队列使用不同的工厂吗?我尝试为每个队列注册一个工厂,而不是对它们进行分组,但这也不起作用。

1 个答案:

答案 0 :(得分:1)

  

这意味着MessageListenerContainer对所有队列使用单个ConnectionFactory吗?

是的。

  

我可以以某种方式将侦听器配置为每个队列使用不同的工厂吗?我尝试为每个队列注册一个工厂,而不是对它们进行分组,但这也不起作用。

否;每个队列需要一个单独的容器。您也可以将实际的连接工厂绑定到该工厂,而不是使用路由工厂。