使用不同的消息选择器创建defaultmessagelistenercontainer运行时

zsohkypk  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(404)

下面是我试图在部署应用程序后创建动态listenercontainer示例的代码。没有消息选择器(注解代码),我可以看到我的消息正在被使用。一旦我添加了setmessageselector,消息就不会被使用。我将生产者配置为使用两个不同的消息选择器生成消息,即color='red'和另一个color='blue'。我已经用springxml配置连接了“red”一个。这种配置没有任何问题。我能够看到消费者正在消费的信息。但是当我试图用color='blue'创建一个动态bean时,它不起作用。如果我在springxml中添加它,同样的方法也不会有任何问题
'''

DefaultMessageListenerContainer defaultMessageListenerContainer=new DefaultMessageListenerContainer();
       defaultMessageListenerContainer.setAutoStartup(Boolean.FALSE);
       defaultMessageListenerContainer.setMessageListener(this.getMessageListener());
       //defaultMessageListenerContainer.setMessageSelector(this.getMessageSelector());
       defaultMessageListenerContainer.setBeanName(this.getBeanName());
       defaultMessageListenerContainer.setConnectionFactory(this.getConnectionFactory());
       defaultMessageListenerContainer.setDestination((Destination) this.getApplicationContext().getBean("customDestination"));
       defaultMessageListenerContainer.setSessionTransacted(Boolean.TRUE);
       defaultMessageListenerContainer.setConcurrentConsumers(1);
       defaultMessageListenerContainer.setMaxConcurrentConsumers(5);
       defaultMessageListenerContainer.initialize();
       defaultMessageListenerContainer.afterPropertiesSet();
       defaultMessageListenerContainer.start();
       System.out.println(defaultMessageListenerContainer.isRunning());
       System.out.println(defaultMessageListenerContainer.isAcceptMessagesWhileStopping());
       System.out.println(defaultMessageListenerContainer.isRegisteredWithDestination());
       ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory();
       beanFactory.registerSingleton("jmsRequestListenerContainer", defaultMessageListenerContainer);

<bean id="jmsRequestListenerContainerdefault" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="concurrentConsumers" value="1" />
    <property name="maxConcurrentConsumers" value="5" />
    <property name="cacheLevel"      value="0"/>
    <property name="connectionFactory"   ref="queueConnectionFactory" />
    <property name="destination"          ref="customeDestination"/>
    <property name="sessionTransacted"  value="true"/>
    <property name="messageListener" ref="jmsRequestListener" />
    <property name="messageSelector" value="color='RED'"/>
</bean>

<jee:jndi-lookup id="queueConnectionFactory" jndi-name="java:/JmsXA"/>

'''
在应用程序启动后动态创建代码时,代码中是否缺少某些内容?

ttisahbt

ttisahbt1#

这对我来说很好。。。

@SpringBootApplication
public class So66359276Application {

    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext ctx = SpringApplication.run(So66359276Application.class, args);
        Thread.sleep(5_000);
        ctx.close();
    }

    @Bean
    public ApplicationRunner runner(JmsTemplate template, ConnectionFactory cf, GenericApplicationContext ctx) {
        template.setDefaultDestinationName("foo");
        return args -> {
            createContainer("RED", new JmsRequestListener1(), cf, ctx);
            createContainer("BLUE", new JmsRequestListener2(), cf, ctx);
            IntStream.range(0, 10).forEach(i -> {
                template.convertAndSend("foo" + i, msg -> {
                    msg.setStringProperty("color", "RED");
                    return msg;
                });
            });
            IntStream.range(0, 10).forEach(i -> {
                template.convertAndSend("bar" + i, msg -> {
                    msg.setStringProperty("color", "BLUE");
                    return msg;
                });
            });
        };
    }

    private void createContainer(String color, MessageListener listener, ConnectionFactory cf,
            GenericApplicationContext ctx) {

        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(cf);
        container.setSessionTransacted(true);
        container.setDestinationName("foo");
        container.setMessageSelector("color='" + color + "'");
        container.setMessageListener(listener);
        ctx.registerBean("container" + color, DefaultMessageListenerContainer.class, () -> container);
        ctx.getBean("container" + color, DefaultMessageListenerContainer.class).start();
    }

}

class JmsRequestListener1 implements MessageListener {

    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("1:" + ((TextMessage) message).getText() + " - "
                    + message.getStringProperty("color"));
        }
        catch (JMSException e) {
            e.printStackTrace();
        }
    }

}

class JmsRequestListener2 implements MessageListener {

    @Override
    public void onMessage(Message message) {
        try {
            System.out.println("2:" + ((TextMessage) message).getText() + " - "
                    + message.getStringProperty("color"));
        }
        catch (JMSException e) {
            e.printStackTrace();
        }
    }

}
1:foo0 - RED
1:foo1 - RED
1:foo2 - RED
1:foo3 - RED
1:foo4 - RED
1:foo5 - RED
1:foo6 - RED
1:foo7 - RED
1:foo8 - RED
1:foo9 - RED
2:bar0 - BLUE
2:bar1 - BLUE
2:bar2 - BLUE
2:bar3 - BLUE
2:bar4 - BLUE
2:bar5 - BLUE
2:bar6 - BLUE
2:bar7 - BLUE
2:bar8 - BLUE
2:bar9 - BLUE
``` `registerBean` 是一种在运行时添加bean定义的新方法,但是使用 `registerSingleTon` 应该也行。

相关问题