メッセージ コードに応じて新しいメッセージ ハンドラー インスタンスを返すインスタンス ファクトリを実装する必要があります。
インターフェース MessageHandler と、このインターフェースの約 50 の実装があります。プロジェクト構造 (maven の循環依存関係...) のため、ファクトリ クラスには具体的なインターフェイスの実装への依存関係がありません。
messageHandler インターフェース:
interface MessageHandler {
void receive(Message message);
MessageCode getMessageCode();
}
すべての MessageHandler 実装は、一意のメッセージ コードを返します。例えば:
class FirstMessageHandler implements MessageHandler {
...
@Override
MessageCode getMessageCode(){
return MessageCodes.MESSAGE_TYPE_ONE;
}
...
}
class SecondMessageHandler implements MessageHandler {
...
@Override
MessageCode getMessageCode(){
return MessageCodes.MESSAGE_TYPE_TWO;
}
...
}
MessageHandlerFactory は、メッセージごとに新しいハンドラー インスタンスを作成する必要があります。ファクトリには具体的な実装に関する情報がなく、実装の Maven パッケージへの依存関係はありません。messageCodes のみが含まれます。
class MessagehandlerFactory {
MessageHandler createHandler(MessageCode messageCode){
...
}
}
検索した後、 @Produce アノテーションとこの素敵な例に関する例を見つけました:
http://docs.oracle.com/javaee/6/tutorial/doc/gkgkv.html
しかし、この例では、ファクトリ内のすべての実装タイプを知る必要があり、これは許可されていません。
実際の解決策は、@Any @Instance を使用することです。
@Inject
@Any
private Instance<MessageHandler> messageHandlers;
@PostConstruct
public void init() {
for (MessageHandler handler : messageHandlers) {
messageHandlerMap.put(handler.getMessageCodes(), handler);
}
}
ただし、このコードは、受信したすべてのメッセージに対してすべての MessageHandler 実装のすべてのメッセージ インスタンスを作成します。@Produce と @Qualifier を組み合わせて、受信した MessageCode に応じて 1 つの MessageHandler インスタンスのみが作成されるようにすることは可能ですか?
Glassfish 3.1.2.2 を使用しています。