Я создал очень простой верблюжий маршрут с использованием компонента mina. Этот маршрут на самом деле использует пользовательский кодек и упакован как пакет osgi. Всякий раз, когда я развертываю его в servicemix (apache-servicemix-4.4.1-fuse-03-06), пакет не переходит в активное состояние, а устанавливается. И конечно, когда я пытаюсь запустить его, я получаю «Ошибка выполнения команды: java.lang.NullPointerException» из консоли, но ничего в журналах ...
Может ли кто-нибудь помочь мне сделать эту работу, я не могу понять, что происходит ... Это проблема упаковки? Я думаю, это как-то связано с загрузкой моего кодека, но я застрял здесь сейчас.
Вот мой XML-маршрут
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="myCodec" class="test.net.mina.codec.MyMinaCodec" />
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="mina:tcp://localhost:9000?sync=true&codec=#myCodec" />
<to uri="log:IncomingMsg" />
</route>
</camelContext>
</beans>
Вот мой завод по производству кодеков
public class MyMinaCodec implements
ProtocolCodecFactory {
public ProtocolDecoder getDecoder(IoSession session) throws Exception {
return new MyMinaDecoder();
}
public ProtocolEncoder getEncoder(IoSession session) throws Exception {
return new ProtocolEncoder() {
public void encode(IoSession arg0, Object arg1, ProtocolEncoderOutput arg2) throws Exception {
}
public void dispose(IoSession arg0) throws Exception {
}
};
}
}
Моя реализация кодека:
public class MyMinaDecoder extends CumulativeProtocolDecoder {
public static final int MSG_HEADER_SIZE = 14;
@Override
protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
// try to read the message header
if (in.remaining() >= MSG_HEADER_SIZE) {
out.write(readsUnsignedBytesToString(in, MSG_HEADER_SIZE));
return true;
} else {
// not enough data
return false;
}
}
private String readsUnsignedBytesToString(IoBuffer in, int length) {
char[] unsignedChars = new char[length];
for (int i = 0; i < length; i++) {
unsignedChars[i] = (char) in.getUnsigned();
}
return new String(unsignedChars);
}
}
И мой pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.servicemix.features</groupId>
<artifactId>features</artifactId>
<version>4.4.1-fuse-03-06</version>
</parent>
<groupId>test</groupId>
<artifactId>mina-test</artifactId>
<packaging>bundle</packaging>
<name>My MINA Test</name>
<version>0.1.6</version>
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mina</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Description>${project.description}</Bundle-Description>
<Import-Package>*</Import-Package>
<Require-Bundle>org.apache.servicemix.bundles.mina</Require-Bundle>
<Export-Package>test.net.*</Export-Package>
<DynamicImport-Package></DynamicImport-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
Спасибо за вашу помощь.
Франсуа