나는 해결책이있다. 그것은 최선의 해결책은 아니지만 매우 잘 작동합니다. 우리가 무슨 짓을
는 IBM com.ibm.mq.connector.inbound.ActivationSpecImpl 클래스를 확장 할 수있는 매우 간단한 ActivationSpecWrapper 클래스를 만드는 것입니다. 이 래퍼 클래스에는 public set/get 속성 (asJNDI)이 있습니다. 클래스가 JNDI 컨텍스트를 통해 MDB를 활성화 할 때 할당 할 모든 속성을 포함하는 App 서버에 정의 된 Properties 클래스를 읽어야하는 경우.
우선 ActivationSpecWrapper 클래스를 새로 만듭니다. 원하는 패키지에 넣을 수 있습니다.
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import com.ibm.mq.connector.inbound.ActivationSpecImpl;
public class ActivationSpecWrapper extends ActivationSpecImpl
{
private static final long serialVersionUID = -529716553593856979L;
private static final String sourceClass = ActivationSpecWrapper.class.getName();
private static final Logger log = Logger.getLogger(sourceClass);
private String asJNDI = null;
public void setAsJNDI(String asJNDI)
{
log.config("asJNDI = " + asJNDI);
this.asJNDI = asJNDI;
try
{
final InitialContext ctx = new InitialContext();
final Properties properties = (Properties) ctx.lookup(asJNDI);
for (final Object key : properties.keySet())
{
try
{
final String value = properties.getProperty((String) key);
final Object field = getSetter((String) key);
if (field != null)
{
if (field instanceof Field)
{
log.fine("Setting " + key + " via Field " + (String) key + " = " + value);
((Field) field).set(this, value);
}
else
{
log.fine("Setting " + key + " via Method " + (String) key + " = " + value);
((Method) field).invoke(this, value);
}
log.config(key + " = " + value);
}
else
{
log.warning("Invalid ActivationSpec Field: " + key);
}
}
catch (final NoSuchFieldException e)
{
log.throwing(sourceClass, "setAsJNDI", e);
}
}
}
catch (final Exception e)
{
log.log(Level.SEVERE, "Error looking up " + asJNDI, e);
return;
}
}
public String getAsJNDI()
{
return asJNDI;
}
private static Object getField(String fieldName) throws NoSuchFieldException
{
return ActivationSpecWrapper.class.getField(fieldName);
}
private static Object getSetter(String fieldName) throws NoSuchFieldException
{
try
{
final StringBuilder sb = new StringBuilder(fieldName.length() + 3).append("set").append(fieldName);
sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
return ActivationSpecWrapper.class.getMethod(sb.toString(), String.class);
}
catch (final NoSuchMethodException e)
{
return getField(fieldName);
}
}
}
방금 파일 wmq.jmsra.rar
내부 META-INF/ra.xml 파일을 수정하는 데 필요한 클래스를 구현합니다. ActivationSpecImpl 클래스의 한 번 발생을 클래스로 변경하십시오. 새 수신 연결 팩토리의 ActivationSpecWrapper 클래스가 사용됩니다. 이제 래퍼 클래스는 사용할 속성에 대해 앱 서버를 살펴볼 수 있습니다. 다음과 같이 내가 이렇게 : 변경 후
<activationspec>
<activationspec-class>
com.ibm.mq.connector.inbound.ActivationSpecImpl
</activationspec-class>
<required-config-property>
<config-property-name>destination</config-property-name>
</required-config-property>
<required-config-property>
<config-property-name>destinationType</config-property-name>
</required-config-property>
</activationspec>
의 META-INF/RA :
: jar -xvf wmq.jmsra.rar META-INF/ra.xml
: perl -pi -e 's/com\.ibm\.mq\.connector\.inbound\.ActivationSpecImpl/your.new.package.ActivatonSpecWrapper/g' META-INF/ra.xml
: jar -uvf wmq.jmsra.rar META-INF/ra.xml
META-INF/ra.xml을 수정하기 전에처럼 보인다 .xml은 다음과 같아야합니다.
<activationspec>
<activationspec-class>
your.new.package.ActivatonSpecWrapper
</activationspec-class>
<required-config-property>
<config-property-name>destination</config-property-name>
</required-config-property>
<required-config-property>
<config-property-name>destinationType</config-property-name>
</required-config-property>
</activationspec>
이제 RAR 파일에 새 패키지를 추가해야합니다. 표준 디렉토리 구조에 있어야합니다.
: jar -uvf wmq.jmsra.rar your/new/package/ActivationSpecWrapper.class
문제는 활성화 사양 대신 관리 개체로 호스트/포트/큐 관리자/채널 (등)을 배치하는 IBM 유래이있다. MDB 큐의 연결 팩토리이므로 관리 객체에 속합니다. IBM은 두 가지 특성 만 허용합니다. 자원 어댑터를 필요로 MDB 클래스
는 글래스 피쉬를 사용하는 경우 또한, 오라클은 정말 것이지 일까지, 글래스 피쉬 @MessageDriven 주석이 JMS의 앱 컨테이너의 기본 자원 어댑터 (OpenMQ)을 가정하기 때문이다. 이 작동하지 않습니다 벤더 고유 ActivationSpecImpl을 의미하며, 따라서 호스트/포트 및 기타 활성 구성 속성에 대한 IMB의 사용자 정의 매개 변수는 자원 어댑터가 글래스 피쉬 - EJB-jar.xml의를 통해 스위치입니다 때까지 주석을 통해 지원되지 않습니다.
JBoss는 자원 어댑터를 변경하는 @ResourceAdapter 주석을 허용하지만, 글래스 피시 만 글래스 피쉬 - EJB-jar.xml의 파일을 통해이 작업을 할 수 있습니다. 그리고 이것을 사용하면 MDB에 3 개의 활성화 구성 등록 정보 (대상 유형) 만 주석 처리하면됩니다. 당신이 JNDI에 게시 할 다른 모든 것들을 배치 할 것입니다.
글래스 피쉬 - EJB-jar.xml의은 다음과 같아야합니다
<?xml version="1.0" encoding="UTF-8"?>
<glassfish-ejb-jar>
<enterprise-beans >
<unique-id>1</unique-id>
<ejb>
<ejb-name>MyMDB</ejb-name>
<mdb-resource-adapter>
<resource-adapter-mid>wmq.jmsra</resource-adapter-mid>
<activation-config>
<activation-config-property>
<activation-config-property-name>asJNDI</activation-config-property-name>
<activation-config-property-value>mq/InboundMessages</activation-config-property-value>
</activation-config-property>
</activation-config>
</mdb-resource-adapter>
</ejb>
</enterprise-beans>
</glassfish-ejb-jar>
MDB를 @MessageDriven 주석은 다음과 같이 보일 것이다 :
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/InboundMessage_queue"),
@ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true") })
public class MyMDB implement MessageListener
{
public void onMessage(Message message)
{
// message handler code goes here...
}
}
마지막을 이 작업을 수행하는 단계는 mq/InboundMessages 속성을 JDNI에 추가하여 정의하는 것입니다. MQ 리스너 자원에 대한 팩토리 특성. 이것은이 domain.xml의 파일에 정의 된 방법입니다
<custom-resource res-type="java.util.Properties" jndi-name="mq/InboundMessages" factory-class="org.glassfish.resources.custom.factory.PropertiesFactory">
<property name="hostName" value="mqserver"></property>
<property name="port" value="1422"></property>
<property name="queueManager" value="MQMNGR"></property>
<property name="channel" value="MQMNGR.SM.S1"></property>
<property name="transportType" value="CLIENT"></property>
</custom-resource>
도움이 되었기를 바랍니다. 이것은 가장 쉬운 솔루션은 아니지만 간단하다. 일단 설치가되면, 이식성이 뛰어나며 앱 서버 관리자는 개발자가 아닌 MQ에 연결 세부 정보를 관리 할 수있다.
이것을 알아 냈습니까? 나는 같은 문제에 뛰어 들고있다. 나는 어떤 오류도 내지 않지만 어떤 메시지도받지 못한다. 나는 심지어 모든 연결 정보를 관리 객체 속성에 넣습니다. – Armand
@Armand Hello. 아니요,이 작업은 취소되었습니다. 나는이 일에 나중에 다시 참여할 가능성이있다. – asu