<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="masterPU" transaction-type="RESOURCE_LOCAL">
...
</persistence-unit>
<persistence-unit name="slavePU" transaction-type="RESOURCE_LOCAL">
...
</persistence-unit>
</persistence>
Managing multiple JPA persistence units with guice-persist
TweetPosted on Sunday Jun 19, 2016 at 06:15PM in Technology
Guice has an extension named guice-persist which aim for providing integration between Guice and a data persistence mechanism. it gives declarative transaction management functionality with the annotation @com.google.inject.persist.Transactional
which works with a standalone environment or plain servlet containers such as Tomcat or Jetty.
guice-persist
supports JPA and it’s simple to use with only one persistence unit, but to use it with multiple persistence units, it requires some tricks.
The official Guice wiki has only some brief description and I can’t find any complete example to implement it in an actual application. so, in this entry I’ll give you a complete example about how to write a module which manages multiple persistence units.
Module hierarchy
To manage multiple PUs in a module, you should create PrivateModule
subclasses of the same number of your persistence units.
Let’s say we have two persistence units that one is named masterPU
and another one named slavePU
. For example, we have the following persistence.xml
in an application:
In this case, we are going to create and assemble classes as the following diagram:
MasterPu
and SlavePu
are qualifier annotations that used for distinguish multiple bindings of JPA classes.
Writing modules
So, how do you write those modules? I’ll show you some important parts of them.
Qualifier annotations
First you need to create the two qualifier annotations something like this:
import static java.lang.annotation.ElementType.*;
@javax.inject.Qualifier
@java.lang.annotation.Target({FIELD, PARAMETER, METHOD})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
public @interface MasterPu {
}
Don’t forget about SlavePu
as well.
JpaPersistPrivateModule
Now here’s the most important part - this class installs JpaPersistModule
and rebinds and exposes JPA class bindings:
public class JpaPersistPrivateModule extends PrivateModule {
protected final String persistenceUnitName;
protected final Properties props;
protected final Class<? extends Annotation> qualifier;
public JpaPersistPrivateModule(final String persistenceUnitName, final Properties props, final Class<? extends Annotation> qualifier) {
this.persistenceUnitName = persistenceUnitName;
this.props = props;
this.qualifier = qualifier;
}
public JpaPersistPrivateModule(final String persistenceUnitName, final Class<? extends Annotation> qualifier) {
this(persistenceUnitName, new Properties(), qualifier);
}
@Override
protected void configure() {
install(new JpaPersistModule(persistenceUnitName).properties(props));
rebind(qualifier, EntityManagerFactory.class, EntityManager.class, PersistService.class, UnitOfWork.class);
doConfigure();
}
private void rebind(Class<? extends Annotation> qualifier, Class<?>... classes) {
for (Class<?> clazz : classes) {
rebind(qualifier, clazz);
}
}
private <T> void rebind(Class<? extends Annotation> qualifier, Class<T> clazz) {
bind(clazz).annotatedWith(qualifier).toProvider(binder().getProvider(clazz));
expose(clazz).annotatedWith(qualifier);
}
/**
* bind your interfaces and classes as well as concrete ones that use JPA classes explicitly
*/
protected void doConfigure() {
// write your bindings in your subclasses
// bindConcreteClassWithQualifier(MyTableService.class);
// ...
}
/**
* binds and exposes a concrete class with an annotation
*/
protected <T> void bindConcreteClassWithQualifier(Class<T> clazz) {
bind(clazz).annotatedWith(qualifier).to(clazz);
expose(clazz).annotatedWith(qualifier);
}
/**
* binds and exposes a concrete class without any annotation
*/
protected void bindConcreteClass(Class<?> clazz) {
bind(clazz);
expose(clazz);
}
}
First, this class installs JpaPersistModule
and it creates bindings of JPA classes without any annotation but those bindings will not be exposed globally because we are in a PrivateModule
. then, this class rebinds them with a qualifier annotation and exposes them with qualifier annotation. eventually, bindings of the four JPA classes will be created with a qualifier annotation.
MyModule, MasterPuModule and SlavePuModule
public class MyModule extends AbstractModule {
@Override
protected void configure() {
install(new MasterPuModule());
install(new SlavePuModule());
}
private static class MasterPuModule extends JpaPersistPrivateModule {
public MasterPuModule() {
super("masterPU", MasterPu.class);
}
@Override
protected void doConfigure() {
bindConcreteClassWithQualifier(MyTableService.class);
}
}
private static class SlavePuModule extends JpaPersistPrivateModule {
public SlavePuModule() {
super("slavePU", SlavePu.class);
}
@Override
protected void doConfigure() {
bindConcreteClassWithQualifier(MyTableService.class);
}
}
}
This class installs two JpaPersistPrivateModule
subclasses for persistence units and binds a service class named MyTableService
which requires injection of EntityManager
. this module creates two distinct annotated bindings for the class.
Note that if you need declarative transaction management by @Transactional
for your service classes, you should create bindings of them inside doConfigure()
. for example, if you creates such bindings in MyModule#configure()
, declarative transactions won’t work.
How about PersistFilter?
If you need PersistFilter
for those two modules, you need to create a binding for each modules inside doConfigure()
as follows:
Key<PersistFilter> key = Key.get(PersistFilter.class, qualifier);
bind(key).to(PersistFilter.class);
expose(key);
Then, install all of modules inside your subclass of ServletModule
. after that, create filter mappings inside configureServlets()
as follows:
filter("/*").through(Key.get(PersistFilter.class, MasterPu.class));
filter("/*").through(Key.get(PersistFilter.class, SlavePu.class));
Conclusion
We have seen an example of a Guice module that manages two persistence units with guice-persist
. check my GitHub repository for the complete example project and testcases.
In-container JMS consumer/producer example
TweetPosted on Saturday May 14, 2016 at 11:06PM in Technology
In this entry, I’ll show you a complete example of using JMS in a Java EE 7 compliant application container, through creating a webapp which consists of both a consumer and a producer. we’re going to deploy it to a container (WildFly 10.0.0.Final) and see a webapp produces and consumes a message.
Launch the container
Launch WildFly server with the following parameter so the bundled message queue broker (ActiveMQ Artemis) will be launched:
./standalone.sh -c standalone-full.xml
For IntelliJ IDEA, check how to launch WildFly with -c standalone-full.xml
from this SO:
http://stackoverflow.com/questions/25849810/how-to-run-wildfly-with-standalone-full-xml-from-intellij-idea
Define a queue
Launch jboss-cli
and define a queue with this command:
jms-queue add --queue-address=testQueue --entries=queue/test,java:jboss/exported/jms/queue/test
Check if it’s successfully created:
[standalone@localhost:9990 /] /subsystem=messaging-activemq/server=default/jms-queue=testQueue:read-resource
{
"outcome" => "success",
"result" => {
"durable" => true,
"entries" => [
"queue/test",
"java:jboss/exported/jms/queue/test"
],
"legacy-entries" => undefined,
"selector" => undefined
}
}
Create the webapp which contains consumer/producer
Here we’re going to create following three classes in the webapp:
-
MyProducer
: a Stateless Session Bean which produces a message to the queue -
MyConsumer
: a Message-Driven Bean which consumes any messages being sent to the queue -
MyServlet
: Receives HTTP GET request and kicksMyProducer
The whole project can be obtained from My GitHub repository.
MyProducer
@Stateless
@LocalBean
public class MyProducer {
@Resource(mappedName = "java:/queue/test")
Queue testQueue;
@Inject
JMSContext jmsContext;
public void enqueue(final String text) {
jmsContext.createProducer().send(testQueue, text);
}
}
MyConsumer
@MessageDriven(name = "MyMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/test"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")})
public class MyConsumer implements MessageListener {
private final static Logger LOGGER = Logger.getLogger(MyConsumer.class.toString());
@Override
public void onMessage(final Message msg) {
if (msg instanceof TextMessage) {
try {
final String text = ((TextMessage) msg).getText();
LOGGER.info(() -> "Received: " + text);
} catch (final JMSException e) {
throw new RuntimeException(e);
}
}
}
}
MyServlet
@WebServlet(urlPatterns = "/")
public class MyServlet extends HttpServlet {
@EJB
MyProducer myProducer;
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
final String text = "Hello, JMS!";
myProducer.enqueue(text);
resp.getWriter().write("Published! check output of the consumer: " + text + "\n");
}
}
Of course you don’t need to put MyConsumer
to the webapp which contains MyProducer
. this is just an example, and in fact, just for asynchronous/background processing in a webapp, you better use more simple EJB Asynchronous methods or ManagedExecutorService instead of JMS. for real use-case, you may create a dedicated app for queue consumers and place your MyConsumer
equivalent into it.
Trigger producing and consuming
Deploy the app and submit HTTP GET request to it as follows.
$ curl http://localhost:8080/jms-example/
If it worked successfully, you’ll see following response from the Servlet:
Published! check output of the consumer: Hello, JMS!
Then check console/output/log of your application container. if the consumer worked successfully, you can see the output something like following:
13:55:18,168 INFO [class jms.MyConsumer] (Thread-438 (ActiveMQ-client-global-threads-271921988)) Received: Hello, JMS!
Conclusion
As described above, thanks to JMS, we can develop a messaging app without tons of annoying, vendor-specific boilar plate code, in lean and simple semantics. there are no worries of maintaining logic of connection handling, polling loop and so forth in the application code.
And note that there are no use of vendor-specific classes - it uses only standardized API which comes from javaee-api
. you may need to alter some portion of code when you deploy this example to other Java EE 7 compliant container such as GlassFish, WebLogic or WebSphere, but that should be few.
PrivateModule, TypeLiteral and AssistedInject - Google Guice techniques for complex scenarios
TweetPosted on Sunday Feb 07, 2016 at 11:44AM in Technology
In this entry I’ll introduce you some Google Guice techniques that can be used for some complex class designing scenarios, I’ve learned recently and found very helpful.
I’ve tested techniques that used in this entry works with Google Guice 3.0 and 4.0. example implementations and test cases can be obtained from my GitHub repository.
PrivateModule
Consider you have classes that something like following diagram:
You have a service class named MyService
which depends on the interface named MyStrategy
(DOC, Depended On Component). the DOC has two implementations, the one EnglishStrategy
says "Hello", when the method of it named sayHello()
is being called, and another one JapaneseStrategy
says "Konnichiwa".
There are annotation classes English
and Japanese
to distinguish two strategy MyService
depends on. these two annotations are written as follows:
import static java.lang.annotation.ElementType.*; @javax.inject.Qualifier @java.lang.annotation.Target({FIELD, PARAMETER, METHOD}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) public @interface English { }
On that situation, you want Guice to produce and inject two MyService
instances for your client class. you would declare injection points as follows:
// (1) call for injection of MyService annotated as @English @Inject @English MyService englishService; // (2) call for injection of MyService annotated as @Japanese @Inject @Japanese MyService japaneseService;
But it doesn’t work due to Guice failed to look MyService
binding annotated as @English
and @Japanese
up.
In such case, you can create two PrivateModule
and install them in your Module
implementation as follows:
@Override protected void configure() { install(new PrivateModule() { @Override protected void configure() { // bind MyService annotated as English to MyService PRIVATELY bind(MyService.class).annotatedWith(English.class).to(MyService.class); // expose MyService annotated as English GLOBALLY. this fulfills injection point (1) expose(MyService.class).annotatedWith(English.class); // bind MyStrategy to EnglishStrategy PRIVATELY bind(MyStrategy.class).to(EnglishStrategy.class); } }); install(new PrivateModule() { @Override protected void configure() { // bind MyService annotated as Japanese to MyService PRIVATELY bind(MyService.class).annotatedWith(Japanese.class).to(MyService.class); // expose MyService annotated as Japanese GLOBALLY. this fulfills injection point (2) expose(MyService.class).annotatedWith(Japanese.class); // bind MyStrategy to JapaneseStrategy PRIVATELY bind(MyStrategy.class).to(JapaneseStrategy.class); } }); }
These PrivateModule
create two bindings:
-
MyService
annotated withEnglish
orJapanese
. -
MyStrategy
without any annotation forEnglishStrategy
orJapaneseStrategy
privately
And, it exposes only the binding 1. If the binding 2 exposes as well or created in global scope, Guice will complain that there are two bindings for MyStrategy
without any annotation. that’s point what PrivateModule
helps.
TypeLiteral
Consider you have following injection points that with generics type parameter:
@Inject List<String> stringList; @Inject List<Integer> integerList;
To bind instances to these injection points, you need to use TypeLiteral
in your Module
implementation as follows:
@Override protected void configure() { bind(new TypeLiteral<List<String>>() { }).toInstance(new ArrayList<String>() {{ add("hello"); }}); bind(new TypeLiteral<List<Integer>>() { }).toInstance(new ArrayList<Integer>() {{ add(123); }}); }
With this module, Guice resolves correct the two injection points with use of generics type parameter.
Also you can leave constructing an instance to Guice if you have an implementation class. for example, consider you have a generic interface as follows:
public interface MyGenericService<T extends Number> { T get(); }
Injection points:
@Inject MyGenericService<Integer> integerService; @Inject MyGenericService<Double> doubleService;
Two implementations:
public class MyIntegerService implements MyGenericService<Integer> { @Override public Integer get() { return 123; } }
public class MyDoubleService implements MyGenericService<Double> { @Override public Double get() { return 0.5; } }
To create bindings to these injection points without creating instances in the module, you can write as follows in your module implementation:
bind(new TypeLiteral<MyGenericService<Integer>>(){}).to(MyIntegerService.class); bind(new TypeLiteral<MyGenericService<Double>>(){}).to(MyDoubleService.class);
AssistedInject
Consider you have classes that something like following diagram:
You have a service class named MyProduct
, which requires a parameter name
for its constructor. the parameter name
varies in each injection, so we create the factory interface MyFactory
for it. also, MyProduct
depends on MyCollaborator
.
You would create MyProduct
instance in your client as follows:
@Inject MyFactory factory; ... public void someMethodInClient() { final MyProduct product = factory.create("foo"); ... }
So, anyway, an implementation of MyFactory
is needed. it must be simple in this case but it brings another boilarplate code that should be avoided as possible. and imagine that if MyProduct
has a hundreds of DOCs? it will be longer as numbers of DOCs grows. manual construction procedure will be something like new MyProduct(new MyCollaborator1(), new MyCollaborator2(), …)
. obviously, it should be avoided.
With AssistedInject
, Guice will do it instead of you.
First, create MyFactory
as follows:
public interface MyFactory { MyProduct create(String name); }
Note that you don’t need to create an implementation class yourself, just forget about it. next, put an additional dependency to your pom.xml
:
<dependency> <groupId>com.google.inject.extensions</groupId> <artifactId>guice-assistedinject</artifactId> <version>4.0</version> </dependency>
Put following procedure to your Module
implementation:
@Override protected void configure() { install(new FactoryModuleBuilder().build(MyFactory.class)); }
Finally, declare an injection point in the MyProduct
class as follows. note that a constructor parameter name
is annotated as @Assisted
:
@Inject MyProduct(@Assisted final String name, final MyCollaborator collaborator) { this.name = name; this.collaborator = collaborator; }
With that, Guice automatically creates MyFactory
implementation for you, and handles parameter name
nicely.
jEdit conditional line deleting with regex
TweetPosted on Sunday Jan 31, 2016 at 06:03PM in Technology
How to delete lines that contains a keyword?
Open Search And Replace
dialog and turn Regular expressions
on then put ^.*KEYWORD.*$\n
to Search for
box, leave Replace with
blank then hit Replace All
.
How to delete lines that NOT contains a keyword?
With ^((?!KEYWORD).)*$\n
do the same to the above. for detail check http://stackoverflow.com/questions/406230/regular-expression-to-match-line-that-doesnt-contain-a-word
My jEdit setup on OS X
TweetPosted on Sunday Jan 31, 2016 at 04:00PM in Technology
Make Option key work
Put a file contains following line to $HOME/Library/jEdit/startup
so shortcuts that used Option
work.
Debug.ALT_KEY_PRESSED_DISABLED = false;
Check http://www.nailedtothex.org/roller/kyle/entry/installing-and-configuring-jedit-5 for further information about setup jEdit on OS X.
Basic configurations
Just for my preferences:
-
Go to View section
-
check Show full path of buffer in title bar
-
-
Go to Editing section
-
set Word wrap to soft
-
set Wrap margin to
100
-
check Soft (emulated with spaces) tabs
-
-
Go to Toolbar
-
uncheck Show tool bar
-
-
Go to Text Area
-
check Caret: thick
-
Customize shortcut
First, choose keymap Mac OS X
. Then customize maps that unusable by default because OS X takes precedence.
-
Incremental Search:
CMD+,
launches application’s preferences window. so I bind it toOption+,
instead.
Note: Draw multi-key shortcuts on screen menu bar option makes some shortcut such as move to dockables unusable, I don’t know why.
Basic operations
-
According to http://comments.gmane.org/gmane.editors.jedit.user/6251 ,
C+c C+j
: (Scroll to Current Line) can be used as "Back To Text Area" equivalent.
Macros
From Macros ⇒ New Macro
, you can create a BeanShell macros. For example, the macro below puts current date to the position of caret:
textArea.setSelectedText(java.time.LocalDate.now().toString());
Recommended plugins
Project Viewer
This plugin enables managing set of files in a unit named project. imagine the same name thing that implemented in some IDEs for Java development such as Eclipse or NetBeans.
There are some plugin that requires it. For example, FastOpen is a companion plugin for Project Viewer that enables open files fast with keyboard. I’ve set Delay before searching option to the smallest value (0.5sec).
The documentation of this plugin can be obtained from http://plugins.jedit.org/plugindoc/ProjectViewer/
Console
This plugin integrates console as a jEdit dockable.
Its advantages are commands that for invoking jEdit’s functionalities. for example, %edit foo.txt
opens a file as a jEdit buffer. another useful one is redirecting output to a new jEdit buffer. for example, typing echo hello, jEdit
in the console and hitting Ctrl+ENTER
yields a new jEdit buffer with contents of hello, jEdit
. also there are many useful variable syntax. e.g. ${f}
for the current buffer’s path name. BeanShell console is available as well.
Also SshConsole Plugin extends its functionality to support remote hosts can be connected with SSH.
I recommend that check all three options in Console ⇒ System Shell ⇒ Events to chdir at Plugin Options.
The documentation of this plugin can be obtained from http://plugins.jedit.org/plugindoc/Console/
WhiteSpace
As its name states it make whitespaces, tabs or control characters visible. I recommend you to set to show leading and trailing tabs / spaces by this plugin.
TextTools
It provides some useful text operations, such as Toggle Range Comment. I recommend you to replace shortcuts for built-in ones by this plugin.
jDiff Plugin
It shows difference between two files pretty nicely as IntelliJ.
Others
Some worth considering plugins are:
-
FTP
-
SQL
-
XML
-
MarkerSets