2

キャメルラウンドをテストしていますが、ルートが Bean の特定のメソッドにアクセスしようとすると、そのようなメソッドが見つからないと言い続けます。ソース:

public class CommunicatorTest
{
    FakeMessageConverter converter;
    CamelContext context;
    ProducerTemplate template;
    String producerEndpoint = "seda:messagesFound";
    long test = 123456789;

    static final Logger logger = Logger.getLogger(CommunicatorTest.class);

    public CommunicatorTest()
    {

    }

    @Before
    public void setUp() throws Exception
    {
        converter = new FakeMessageConverter();
        SimpleRegistry registry = new SimpleRegistry();
        registry.put("converter", converter);
        context = new DefaultCamelContext(registry);
        template = context.createProducerTemplate();
        context.addRoutes(new CommunicatorRoute());

        logger.info("Done creating context");

        context.start();
    }

    @After
    public void tearDown() throws Exception
    {
        context.stop();
    }


    @Test
    public void testExistanceOfBean()
    {
        Object lookup = context.getRegistry().lookup("converter");
        assertTrue("Object not a MessageConverter", lookup instanceof FakeMessageConverter);
    }

    @Test
    public void testRoute()
    {
        Message msg = new Message();
        msg.setHeader(new MessageHeader());
        msg.getHeader().setSourceId(test);

        logger.info("Sending data");
        template.sendBody(producerEndpoint, msg);


        assertEquals("value not the same", test, converter.getSid());
        logger.info("Done Sending");
    }

    private static class FakeMessageConverter
    {

        private long sid;
        private boolean edited = false;

        public FakeMessageConverter()
        {
        }

        public void processMessage(Message msg)
        {
            sid = msg.getHeader().getSourceId();
            edited = true;
            logger.info("The sid"+sid);
        }

        /**
         * @return the sid
         */
        public long getSid()
        {
            return sid;
        }

        /**
         * @param sid the sid to set
         */
        public void setSid(long sid)
        {
            this.sid = sid;
        }
    }

}

ルートは次のとおりです。

public class CommunicatorRoute extends RouteBuilder
{

    @Override
    public void configure() throws Exception
    {
        from("seda:messagesFound").bean("converter", "processMessage");
    }

}

例外は次のとおりです。

ERROR [org.apache.camel.component.seda.SedaConsumer] - Error processing exchange. Exchange[Message: net.package.Message@f593af]. Caused by: [org.apache.camel.component.bean.MethodNotFoundException - Method with name: processMessage not found on bean: converter. Exchange[Message: net.package.message.Message@f593af]]

org.apache.camel.component.bean.MethodNotFoundException: 名前のメソッド: processMessage が bean: コンバーターに見つかりません。交換[メッセージ: com.saic.jswe.common.cdif.message.Message@f593af]

私はまだキャメルにかなり慣れていないので、本当に単純な間違いを犯している場合はお知らせください.

4

2 に答える 2

2

あなたのクラスはプライベート静的です。Camel がアクセスできるように public static である必要があります。

于 2012-09-17T18:54:59.417 に答える
0

だから私はこれを理解しました、そしてそれは単純なエラーでした。from("seda:messagesFound").bean("converter", "processMessage");ルートビルダーは、機能しなかった回線を使用しました。しかし、ルートをfrom("seda:messagesFound").beanref("converter", "processMessage");とに変更することで(クラウスが内部クラスのパブリックへのアクセスを変更することに言及しているように)、それはうまく機能しました。クラスをプライベートではなくパブリックに変更するだけで、表示されるエラーが変更されるだけです。

問題の核心は、.bean()メソッドがレジストリを参照しないことです。そのため、パスしたときに、converter使用するBeanの名前を付けていると思いましたが、.bean()のバリエーションはこれだけです。ですpublic Type bean(Object bean, String method)。したがって、もちろん、ラクダはメソッドを見つけることができませんでした。コンバーターではなく、渡した文字列でメソッド「processMessage」を見つけようとしていました。

于 2012-09-19T13:20:22.857 に答える