2017-04-05 1 views
0

Websphere Application Server 7.x 버전을 사용하고 있습니다.Websphere Application Server의 setMessageListener jms 메소드는 javax.jms.IllegalStateException을 생성합니다. setMessageListener 메소드가 허용되지 않습니다.

아래와 같이 JMS API를 사용하여 MQ에서 버퍼링 된 메시지를 읽으 려합니다. 내가 link1에서 언급 , link2

@Resource(lookup = "jms/ConnectionFactory") 
    private static ConnectionFactory connectionFactory; 

    @Resource(lookup = "jms/Queue") 
    private static Queue queue; 

    public void readMessagesFromQueue() { 
     try { 

      Connection connection = connectionFactory.createConnection(); 
      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
      MessageConsumer consumer = session.createConsumer(queue); 

      MyListener myListener = new MyListener(); 
      consumer.setMessageListener(myListener); // Error here 
      connection.start(); 
     } catch (JMSException e) { 
      throw new RuntimeException(e); 
     } 
    } 

MyListener 클래스 :

public class MyListener implements MessageListener { 
    @Override 
    public void onMessage(Message message) { 
     try { 
      String text=((TextMessage)message).getText(); 
      System.out.println(text); 
     } 
     catch (JMSException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

나는 예외 무엇입니까 실행 시간 중 :

javax.jms.IllegalStateException: Method setMessageListener not permitted 

내가 link 점에서 볼 수를 asyn의 메소드 setMessageListener chronous 메시징을 사용하는 경우 WebSphere Application Server에서이 메소드를 사용하는 것이 금지됩니다.

질문 1 :

setMessageListener 방법은 WAS에서 사용할 수 없습니다?
그렇지 않은 경우 위의 필수 기능을 달성하기위한 해결 방법은 무엇입니까?

질문 2 :

내가 즉 필요성을 설명 할 수있다 :
은 JMS의 청취자가 즉시 메시지가 큐에 도착 메시지를 받아 봐하지 않아야합니다. 하지만 청취자는 내가 원하는 시간에만 듣기를 바랍니다.
나는 위에서 언급 한 접근법을 시도했다. 하지만 예외 때문에 차단되었습니다.

다른 방법으로이 작업을 수행 할 수 있습니까?

+0

비동기 메시지는 다음 MDB를 만들 받으려면, 그렇지 않으면 메시지를 읽을 수 consumer.receive()'방법'전화 . – Gas

+0

@Gas, MDB를 사용하여 비동기 적으로 메시지를받을 수 있습니다. 그러나 MDB를 언젠가는 비활성 상태로 만들어 언젠가는 활성화시켜야합니다. –

답변

-1

당신은 때 그는 null과 ConnectionFactory 큐가 나는 때문에 소비자보다 오류 먹으 렴 생각이

connectionFactory = new ConnectionFactory(the arguments); Queue q = new Queue(the arguments);

사용할 수 질수 시도 초기화되지 않았습니다.

+0

비동기 메시징 용 setMessageListener 메소드는 [link] (http://www-01.ibm.com/support/docview.wss?uid=swg21114239)에서 볼 수 있으며 WebSphere에서이 메소드를 사용하는 것은 금지되어 있습니다 Application Server –

0

이것은 WebSphere 문제점이 아닙니다. 한마디로
의 JMS 사양 당신이 JEE 컨테이너에서이 기능을 사용하는 것을 허용하지 않습니다 가 API here을 확인하십시오 : 당신이 MDB를 관리 활성화 스펙을 비활성화 할 수 있습니다 메시지 수신을 중지하려면

void setMessageListener(MessageListener listener) 
      throws JMSException 

    Sets the MessageConsumer's MessageListener. 
    {...} 
    This method must not be used in a Java EE web or EJB application. Doing so may cause a JMSException to be thrown though this is not guaranteed. 
0

. wsadmin 스크립트를 작성하여 crontab에 넣거나 관리 콘솔을 통해 일시 중지하거나 JMX 및 MBean을 사용하여 일시 중지 할 수 있습니다.

확인이 링크 :

UPDATE

다음은 코드 샘플입니다. 이것은 의사 코드입니다. 오류 처리가없고 올바른 ActiveSpec인지 확인하지 않습니다. 이 코드는 역할 관리자 또는 운영자가있는 사용자로 실행해야하므로 (응용 프로그램 보안을 활성화해야 함) 호출 한 서블릿에 대해 @RunAs 역할을 지정하여 수행했지만 다른 방식으로 수행해야 할 수도 있습니다.

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    PrintWriter out = response.getWriter(); 
    String action = request.getParameter("action"); 

    try { 
     AdminService adminService = AdminServiceFactory.getAdminService(); 
     ObjectName asName = new ObjectName("WebSphere:*,type=J2CMessageEndpoint"); 

     Set names = adminService.queryNames(asName, null); 
     System.out.println("Found:" + names.size()); 

     if(names.size() > 0) { 
      ObjectName mbean = (ObjectName) names.iterator().next(); 
      System.out.println("mbean: " + mbean); 

      if(action != null && action.equals("pause")) { 
       adminService.invoke((ObjectName) mbean, "pause", null, null); 
       System.out.println("invoked"); 
      } 
      else if(action != null && action.equals("resume")) { 
       adminService.invoke((ObjectName) mbean, "resume", null, null); 
       System.out.println("invoked"); 
      } 
     } 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
당신은 AS가 비활성화 및 활성화하는 로그에 볼 수

:

[4/20/17 4:24:41:029 PDT] 00000094 SystemOut  O mbean: WebSphere:name=JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,process=server1,ActivationSpec=jms/MyAS,platform=dynamicproxy,node=ubuntuNode01,J2EEApplication=JMXTestEAR,j2eeType=JCAMessageEndpoint,J2EEServer=server1,Server=server1,version=9.0.0.3,J2CResourceAdapter=SIB JMS Resource Adapter,type=J2CMessageEndpoint,mbeanIdentifier=cells/ubuntuNode01Cell/nodes/ubuntuNode01/servers/server1/resources.xml#J2CResourceAdapter_1492682844859#JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,cell=ubuntuNode01Cell,MessageDrivenBean=JMXTestEAR#JMXTestWeb.war#TestMDB,spec=1.0 
[4/20/17 4:24:41:037 PDT] 00000094 ActivationSpe I J2CA0524I: The Message Endpoint for ActivationSpec jms/MyAS (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application JMXTestEAR#JMXTestWeb.war#TestMDB is deactivated. 
[4/20/17 4:24:41:038 PDT] 00000094 SystemOut  O invoked 
[4/20/17 4:24:52:890 PDT] 00000094 SystemOut  O Found:1 
[4/20/17 4:24:52:890 PDT] 00000094 SystemOut  O mbean: WebSphere:name=JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,process=server1,ActivationSpec=jms/MyAS,platform=dynamicproxy,node=ubuntuNode01,J2EEApplication=JMXTestEAR,j2eeType=JCAMessageEndpoint,J2EEServer=server1,Server=server1,version=9.0.0.3,J2CResourceAdapter=SIB JMS Resource Adapter,type=J2CMessageEndpoint,mbeanIdentifier=cells/ubuntuNode01Cell/nodes/ubuntuNode01/servers/server1/resources.xml#J2CResourceAdapter_1492682844859#JMXTestEAR#JMXTestWeb.war#TestMDB_J2CMessageEndpoint,cell=ubuntuNode01Cell,MessageDrivenBean=JMXTestEAR#JMXTestWeb.war#TestMDB,spec=1.0 
[4/20/17 4:24:52:897 PDT] 00000094 SibMessage I [:] CWSIV0777I: A connection to messaging engine ubuntuNode01.server1-myBus for destination testQ1 on bus myBus has been successfully created. 
[4/20/17 4:24:52:898 PDT] 00000094 ActivationSpe I J2CA0523I: The Message Endpoint for ActivationSpec jms/MyAS (com.ibm.ws.sib.api.jmsra.impl.JmsJcaActivationSpecImpl) and MDB Application JMXTestEAR#JMXTestWeb.war#TestMDB is activated. 
[4/20/17 4:24:52:899 PDT] 00000094 SystemOut  O invoked 
+0

JMX로 진행할 참조 링크가 있습니까? 또한 JBoss를 사용하지 않기 때문에 Websphere에서 JMX를 사용할 수 있습니까? –

+0

@AlagammalP 당신을 도울 샘플 코드를 추가했습니다. – Gas

관련 문제