Sei sulla pagina 1di 6

JMS Basics

Queue
Topic
ConnectionFactory
QueueSender/MessageProducer
QueueReceiver/MessageConsumer/MDB
QueueBrowser

Installing and Configuring Jboss A-MQ


Download a binary distribution of Jboss A-MQ and unpack it.
To run an Jboss A-MQ broker.
bin>./amq
DLQ and Message redelivery
Changes require in activemq.xml
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" producerFlowControl="true">
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000" />
</pendingMessageLimitStrategy>
</policyEntry>
<policyEntry queue=">" producerFlowControl="true"memoryLimit="1mb">
<deadLetterStrategy>
<individualDeadLetterStrategy
queuePrefix="DLQ."
useQueueForQueueMessages="true" />
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>

Message Expiry.
QueueSender qsender
qsender.setTimeToLive(1000);

Broker persistence
<persistenceAdapter>
<kahaDB directory="${data}/kahadb"/>
</persistenceAdapter>

OR

<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracle-ds">
</jdbcPersistenceAdapter>
</persistenceAdapter>

~~
<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver" />
<property name="url"
value="jdbc:oracle:thin:@XXXXXXXX:1521:orcl" />
<property name="username" value="XXXX" />
<property name="password" value="XXXX" />
<property name="poolPreparedStatements" value="true" />
</bean>

Cursors
There are two additional types of cursor that could be used: VM Cursor and File based Cursor

VM Cursor

<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="org.apache.>">
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="Test.DLQ."/>
</deadLetterStrategy>
<pendingQueuePolicy>
<vmQueueCursor />
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>

File Based Cursor

<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="org.apache.>">
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="Test.DLQ."/>
</deadLetterStrategy>
<pendingQueuePolicy>
<fileQueueCursor />
</pendingQueuePolicy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>

Message Selectors

Producer

Mesasge message = session.createTextMessage("<foo>hey</foo>");


message.setStringProperty("JMSXGroupID", "IBM_NASDAQ_20/4/05");
...
producer.send(message);

Consumer

private QueueSession qsession;


private QueueReceiver qreceiver;
qreceiver = qsession.createReceiver(queue,JMSXGroupID='IBM_NASDAQ_20/4/05');

Master/Slave configuration
<persistenceAdapter>
<kahaDB directory="/sharedFileSystem/sharedBrokerData" />
<locker>
<shared-file-locker lockAcquireSleepInterval="10000" />
</locker>
</persistenceAdapter>

Note:- Run both Master and Salve with same directory


Network Connectors

Static

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://activemq.org/config/1.0">
<broker brokerName="receiver" persistent="false" useJmx="false">
<networkConnectors>
<networkConnector name="linkToBrokerB"
uri="static:(tcp://localhost:61617)"
duplex="true" userName="admin" password="admin"/>
<networkConnector name="linkToBrokerC"
uri="static:(tcp://localhost:61618)"
duplex="true" userName="admin" password="admin"/>
</networkConnectors>
<persistenceAdapter>
<memoryPersistenceAdapter/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://localhost:62002"/>
</transportConnectors>
</broker>
</beans>

Dynamic

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://activemq.org/config/1.0">
<broker name="sender" persistent="false" useJmx="false">
<networkConnectors>
<networkConnector uri="multicast://default"/>
</networkConnectors>
<persistenceAdapter>
<memoryPersistenceAdapter/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://localhost:0"
discoveryUri="multicast://default"/>
</transportConnectors>
</broker>
</beans>

Destination filtering
Wildcard
.
*
>

Description
Separates segments in a path name.
Matches any single segment in a path name.
Matches any number of segments in a path name.

Destination wildcard
PRICE.>
PRICE.STOCK.>
PRICE.STOCK.NASDAQ.*
PRICE.STOCK.*.IBM

What it matches
Any price for any product on any exchange.
Any price for a stock on any exchange.
Any stock price on NASDAQ.
Any IBM stock price on any exchange.

<networkConnectors>
<networkConnector name="linkToBrokerB"
uri="static:(tcp://localhost:61002)"
networkTTL="3">
<dynamicallyIncludedDestinations>
<queue physicalName="TRADE.STOCK.>"/>
<topic physicalName="PRICE.STOCK.>"/>
</dynamicallyIncludedDestinations>
</networkConnector>
</networkConnectors>

Failover
failover:(tcp://local:61616,tcp://remote:61616)

AMQ Resource Adapter:


Standalone.xml:
<resource-adapters>
<resource-adapter id="activemq-rar.rar">
<archive>
activemq-rar.rar
</archive>
<transaction-support>XATransaction</transaction-support>
<config-property name="Password">
admin
</config-property>
<config-property name="UserName">
admin
</config-property>
<config-property name="ServerUrl">
tcp://localhost:63636?jms.rmIdFromConnectionId=true
</config-property>
<connection-definitions>
<connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndiname="java:/ConnectionFactory" enabled="true" pool-name="ConnectionFactory">
<xa-pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>20</max-pool-size>
<prefill>true</prefill>
<is-same-rm-override>false</is-same-rm-override>
</xa-pool>
<recovery>
<recover-credential>
<user-name>admin</user-name>
<password>admin</password>
</recover-credential>
</recovery>
</connection-definition>
</connection-definitions>
<admin-objects>
<admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndiname="java:/queue/TestAMQ" use-java-context="true" pool-name="HELLOWORLDMDBQueue">
<config-property name="PhysicalName">
HELLOWORLDMDBQueue
</config-property>
</admin-object>
<admin-object class-name="org.apache.activemq.command.ActiveMQTopic" jndiname="java:/topic/TestAMT" use-java-context="true" pool-name="HELLOWORLDMDBTopic">
<config-property name="PhysicalName">
HELLOWORLDMDBTopic
</config-property>
</admin-object>
</admin-objects>
</resource-adapter>
</resource-adapters>
And:

<mdb>
<resource-adapter-ref resource-adapter-name="activemq-rar.rar"/>
<bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
</mdb>
In MDB code:
@MessageDriven(
activationConfig={
@ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="HELLOWORLDMDBQueue")
}
)
@ResourceAdapter(value="activemq-rar.rar")
public class MyMDB implements MessageListener{
public void onMessage(Message message) {
TextMessage textMessage = (TextMessage) message;
try {
System.out.println("nnt Message has been Received by MDB : "+ textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}

Potrebbero piacerti anche