1

Apache ActiveMQ は、たとえば Camel ルートのトピック/キューなどのソースのワイルドカードをサポートしています。

ドキュメントは、次のようなパターンを再帰的に一致させる可能性があることを示しています。

PRICE.STOCK.> 

マッチ

PRICE.STOCK.FR.SOUTH
PRICE.STOCK.FR
PRICE.STOCK.UK.NORTH.MANCHESTER

等々...

ただし、私の例では、似ているが特定の単語で終わるものと一致させる必要があります。

package org.ruffp.camel.quartz;

import org.apache.activemq.camel.component.ActiveMQComponent;
import org.apache.camel.CamelContext;
import org.apache.camel.EndpointInject;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

    public class FromWildcardRouteTest extends CamelTestSupport {

        @Produce(uri = "activemq:topic:TEST.START.NB.1.Mirrored")
        private ProducerTemplate start1;

        @Produce(uri = "activemq:topic:TEST_START.Mirrored")
        private ProducerTemplate start2;

        @EndpointInject(uri = "mock:DEST")
        private MockEndpoint end;

        @Test
        public void testRoute() throws Exception {

            resetMocks();

            end.expectedMessageCount(2);

            start1.sendBody("test-1");
            start2.sendBody("test-2");

            assertMockEndpointsSatisfied();

        }

        @Override
        protected RouteBuilder createRouteBuilder() throws Exception {

            return new RouteBuilder() {

                @Override
                public void configure() throws Exception {

                    //@formatter:off
                    from("activemq:topic:*(.>).Mirrored").routeId("mirrored")
                        .setProperty("TEST_DESC").body()
                        .to(end);
                    //@formatter:on
                }
            };

        }

        @Override
        protected CamelContext createCamelContext() throws Exception {
            CamelContext context = super.createCamelContext();
            String amqUrl = "vm://localhost?broker.persistent=false";

            log.info("Creating Camel Context for AMQ: '{}'", amqUrl);
            context.addComponent("activemq",
                    ActiveMQComponent.activeMQComponent(amqUrl));
            return context;
        }
    }

私がキャッチしたいトピックは、ゼロまたは多くのドットを含み、.1 つまたは多くのアンダースコアを含み_.Mirrored.

いくつかの例 (すべて先頭に が付いていactivemq:topic:ます):

 - TEST_INBOUND.Mirrored            -> catched
 - UK.NORTH.TEST_INBOUND.Mirrored   -> catched
 - FR.SOUTH.TEST_INBOUND.Mirrored   -> catched
 - CH.TEST_INBOUND.Mirrored         -> catched
 - TEST_INBOUND                     -> not catched
 - TEST_INBOUND_Mirrored            -> not catched
4

1 に答える 1

1

試してみたような複雑なパターンで一致させることはできません。キュー名の先頭が一致し、> または * をワイルドカードとして使用できることが文書化されている場合のみです。それ以上はサポートされていません。

ドキュメントの最後に、次のようなケースで使用できるプラグインがあることに注意してください。

<plugins>
   .....
   <destinationPathSeparatorPlugin pathSeparator="_" />
</plugins>

その場合、ワイルドカードはアンダースコアでも機能します。

于 2015-04-25T12:43:50.027 に答える